Odpowiedzi:
Zrób to ręcznie:
add_column :post, :author_id, :integer
ale teraz, kiedy tworzysz instrukcję should_to, będziesz musiał ją zmodyfikować, więc teraz musisz wywołać
def post
belongs_to :user, :foreign_key => 'author_id'
end
schema_plus
gem, t.references :category, index: true, foreign_key: true, references: :match_categories
działał również dla mnie w pliku migracyjnym.
Jeśli definiowania Post
tabeli wzorcowej, można ustawić references
, index
a foreign_key
w jednym wierszu:
t.references :author, index: true, foreign_key: { to_table: :users }
Jeśli dodajesz odniesienia do istniejącej tabeli, możesz to zrobić:
add_reference :posts, :author, foreign_key: { to_table: :users }
Uwaga: wartość domyślna index
to true.
null
s. Aby im nie pozwolić, dodaj zwykłą opcję null: false
.
W Railsach 4.2+ możesz także ustawić klucze obce w bazie danych, co jest świetnym pomysłem .
W przypadku prostych skojarzeń można to zrobić również podczas t.references
dodawania foreign_key: true
, ale w tym przypadku będziesz potrzebować dwóch wierszy.
# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id
# The model
belongs_to :author, class_name: "User"
references: :users
opcji w add_reference
rozmowie. Nie widzę tego udokumentowanego w dokumentach i wydaje się, że działa po mojej stronie bez tego.
W rails 4, używając postgresql i gem schema_plus , możesz po prostu napisać
add_reference :posts, :author, references: :users
Spowoduje to utworzenie kolumny author_id
, do której poprawnie odwołuje się users(id)
.
A w swoim modelu piszesz
belongs_to :author, class_name: "User"
Uwaga, podczas tworzenia nowej tabeli możesz zapisać ją w następujący sposób:
create_table :things do |t|
t.belongs_to :author, references: :users
end
Uwaga:
schema_plus
klejnot w całości nie jest kompatybilny z railsami 5+, ale taką funkcjonalność oferuje gem schema_auto_foreign_keys (część schema_plus), który jest kompatybilny z railsami 5.
create_table
:t.references :author, references: :users
:references
faktycznie coś robią.
schema_plus
klejnotu od wieków i tak naprawdę dodaje on tę funkcjonalność. Odpowiednio zredagowałem odpowiedź.
t.references :col_name, references: other_table_name
działa bez instalowania dodatkowych klejnotów.
Jeśli nie używasz klucza obcego, nie ma znaczenia, jaka jest rzeczywista nazwa drugiej tabeli.
add_reference :posts, :author
Począwszy od Rails 5 , jeśli używasz klucza obcego, możesz określić nazwę innej tabeli w opcjach klucza obcego. (patrz https://github.com/rails/rails/issues/21563 do dyskusji)
add_reference :posts, :author, foreign_key: {to_table: :users}
Przed Railsami 5 należy dodać klucz obcy jako oddzielny krok:
add_foreign_key :posts, :users, column: :author_id
{to_table: :users}
alias_attribute (nowa_nazwa, stara_nazwa) jest bardzo przydatna. Po prostu stwórz swój model i relację:
rails g model Post title user:references
następnie edytuj model i dodaj alias atrybutu za pomocą
alias_attribute :author, :user
Po tym będziesz mógł uruchamiać takie rzeczy jak
Post.new(title: 'My beautiful story', author: User.first)