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!

Author: Kick Buttowski, 2011-10-22

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.

 170
Author: Jon M.,
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 Tutaj wpisz opis obrazka

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. Tutaj wpisz opis obrazka

 36
Author: illusionist,
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`
 13
Author: Krule,
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