generowanie modelu za pomocą user: reference vs user id: integer
Jestem zdezorientowany, jak wygenerować model, który należy do innego modelu. Moja książka używa tej składni, aby skojarzyć Mikropost z użytkownikiem:
rails generate model Micropost user_id:integer
Ale http://guides.rubyonrails.org / mówi, aby zrobić to tak:
rails generate model Micropost user:references
Migracje generowane przez te 2 są różne. Ponadto, w przypadku tego pierwszego, skąd rails wie, że {[2] } jest kluczem obcym odwołującym się user
? Dzięki!
3 answers
Oba wygenerują te same kolumny podczas wykonywania migracji. W konsoli rails widać, że tak jest:
:001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)
Drugie polecenie dodaje relację belongs_to :user
w modelu Mikropostu, podczas gdy pierwsze nie. Gdy ta relacja jest określona, ActiveRecord zakłada, że klucz obcy jest przechowywany w kolumnie user_id
i użyje modelu o nazwie User
do utworzenia instancji konkretnego użytkownika.
Drugie polecenie dodaje również indeks na Nowym user_id
kolumna.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 10:17:55
Skąd rails wie, że {[2] } jest obcym kluczem odwołującym się
user
?
Rails nie wie, że {[2] } jest obcym kluczem odwołującym się do user
. W pierwszym poleceniu rails generate model Micropost user_id:integer
dodaje tylko kolumnę {[2] } jednak rails nie zna użycia col. musisz ręcznie umieścić linię w modelu Micropost
class Micropost < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_many :microposts
end
Słowa kluczowe belongs_to
i has_many
określają związek między tymi modelami i deklarują user_id
jako klucz obcy User
model.
Późniejsze polecenie rails generate model Micropost user:references
dodaje linię belongs_to :user
w modelu Micropost
i niniejszym deklaruje jako klucz obcy.
FYI
Deklarowanie kluczy obcych przy użyciu poprzedniej metody tylko pozwala Rails wiedzieć o relacjach, jakie mają modele/tabele. Baza danych nie jest znana na temat związku. Dlatego podczas generowania diagramów EER za pomocą oprogramowania takiego jak MySql Workbench
okazuje się, że nie ma wątków relacji narysowanych między modelami. Jak w poniższych pic
Jeśli jednak użyjesz późniejszej metody, okaże się, że plik migracji wygląda następująco:
def change
create_table :microposts do |t|
t.references :user, index: true
t.timestamps null: false
end
add_foreign_key :microposts, :users
Teraz klucz obcy jest ustawiany na poziomie bazy danych. i możesz wygenerować odpowiednie diagramy EER
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-22 11:01:39
Dla pierwszego, konwencja nad konfiguracją. Domyślnie Rails, gdy odwołujesz się do innej tabeli za pomocą
belongs_to :something
Jest szukać something_id
.
references
, or belongs_to
jest właściwie nowszym sposobem pisania tego pierwszego z kilkoma dziwactwami.
Ważne jest, aby pamiętać, że nie będzie tworzyć kluczy obcych dla Ciebie. Aby to zrobić, musisz skonfigurować go bezpośrednio używając:
t.references :something, foreign_key: true
t.belongs_to :something_else, foreign_key: true
Lub (zwróć uwagę na liczbę mnogą):
add_foreign_key :table_name, :somethings
add_foreign_key :table_name, :something_elses`
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-31 09:14:28