Nie wiem, jak wygenerować model, który należy do innego modelu. Moja książka używa tej składni do powiązania Micropost z użytkownikiem:
rails generate model Micropost user_id:integer
ale http://guides.rubyonrails.org/ mówi, żeby zrobić to w ten sposób:
rails generate model Micropost user:references
Migracje generowane przez te 2 są różne. Ponadto, w przypadku pierwszego, skąd railsy wiedzą, że user_id
jest to odwołanie do klucza obcego user
? Dzięki!
źródło
Same Railsy nie wiedzą, że
user_id
jest to odwołanie do klucza obcegouser
. W pierwszym poleceniurails generate model Micropost user_id:integer
dodaje tylko kolumnę,user_id
ale rails nie znają użycia col. Musisz ręcznie umieścić linię wMicropost
modelusłowa kluczowe
belongs_to
ihas_many
określ związek między tymi modelami i zadeklarujuser_id
jako klucz obcy doUser
modelu.Późniejsze polecenie
rails generate model Micropost user:references
dodaje liniębelongs_to :user
doMicropost
modelu i niniejszym deklaruje jako klucz obcy.FYI
Zadeklarowanie kluczy obcych przy użyciu poprzedniej metody pozwala jedynie Railsom wiedzieć o relacji między modelami / tabelami. Baza danych nie jest znana na temat relacji. Dlatego podczas generowania diagramów EER przy użyciu oprogramowania takiego jak
MySql Workbench
okazuje się, że między modelami nie ma wątków relacji. Jak na poniższym zdjęciuJeśli jednak użyjesz późniejszej metody, okaże się, że plik migracji wygląda następująco:
Teraz klucz obcy jest ustawiony na poziomie bazy danych. i możesz wygenerować odpowiednie
EER
diagramy.źródło
add_foreign_key
działania z opcjąforeign_key: true
dot.references
linii, co oznaczaindex: true
. Tak jest terazt.references :user, foreign_key: true
. Obecnie nie ma dokumentacji dotyczącej tejforeign_key
opcji, więc jest to tylko moje założenie.add_reference
akcja ma:foreign_key
opcję, która dodaje odpowiednie ograniczenie klucza obcego . Myślę, że ta opcja zrobiłaby to samo podczas tworzenia tabeli.add_foreign_key :microposts, :users
to jakieś znaczenie dla Railsów?W pierwszym przypadku konwencja nad konfiguracją. Railsy są domyślne, gdy odwołujesz się do innej tabeli z
jest szukać
something_id
.references
, abelongs_to
właściwie jest nowszym sposobem pisania tego pierwszego z kilkoma dziwactwami.Należy pamiętać, że nie utworzy on dla Ciebie kluczy obcych. Aby to zrobić, musisz ustawić to jawnie za pomocą:
lub (zwróć uwagę na liczbę mnogą):
źródło
:polymorphic
opcji (która IMHO w większości przypadków nie jest dobrym pomysłem). Jeśli chcesz używać kluczy obcych w ActiveRecord, użyj obcego .add_foreign_key
trafił do ActiveRecord.