Chcę zrobić migration
w Railsach odwołanie do innej tabeli. Zwykle zrobiłbym coś takiego:
add_column :post, :user, :references
Spowoduje to utworzenie kolumny o nazwie user_id
w posts
tabeli. Ale co jeśli zamiast tego user_id
chcę czegoś takiego author_id
? Jak mogę to zrobić?
schema_plus
gem,t.references :category, index: true, foreign_key: true, references: :match_categories
działał również dla mnie w pliku migracyjnym.Do szyn 5+
Definicja początkowa:
Jeśli definiowania
Post
tabeli wzorcowej, można ustawićreferences
,index
aforeign_key
w jednym wierszu:Aktualizuj istniejącą:
Jeśli dodajesz odniesienia do istniejącej tabeli, możesz to zrobić:
Uwaga: wartość domyślna
index
to true.źródło
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
dodawaniaforeign_key: true
, ale w tym przypadku będziesz potrzebować dwóch wierszy.źródło
references: :users
opcji wadd_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ć
Spowoduje to utworzenie kolumny
author_id
, do której poprawnie odwołuje sięusers(id)
.A w swoim modelu piszesz
Uwaga, podczas tworzenia nowej tabeli możesz zapisać ją w następujący sposób:
źródło
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.
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)
Przed Railsami 5 należy dodać klucz obcy jako oddzielny krok:
źródło
{to_table: :users}
alias_attribute (nowa_nazwa, stara_nazwa) jest bardzo przydatna. Po prostu stwórz swój model i relację:
następnie edytuj model i dodaj alias atrybutu za pomocą
Po tym będziesz mógł uruchamiać takie rzeczy jak
źródło