Szyny 4.x
Gdy już masz users
i uploads
tabele i chcą dodać nową relację między nimi.
Wszystko, co musisz zrobić, to: po prostu wygenerować migrację za pomocą następującego polecenia:
rails g migration AddUserToUploads user:references
Który utworzy plik migracji jako:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Następnie uruchom migrację za pomocą rake db:migrate
. Ta migracja zajmie się dodaniem nowej kolumny o nazwie user_id
do uploads
tabeli (odwołując się do id
kolumny w users
tabeli), a także doda indeks do nowej kolumny.
AKTUALIZACJA [For Rails 4.2]
Nie można ufać Railsom, aby zachowały integralność referencyjną; Relacyjne bazy danych przychodzą nam z pomocą. Oznacza to, że możemy dodawać ograniczenia klucza obcego na poziomie samej bazy danych i upewnić się, że baza danych odrzuci każdą operację, która narusza integralność referencyjną tego zestawu. Jak skomentował @infoget, Rails 4.2 jest dostarczany z natywną obsługą kluczy obcych (integralność referencyjna) . Nie jest to wymagane, ale możesz dodać klucz obcy (ponieważ jest to bardzo przydatne) do odwołania, które utworzyliśmy powyżej.
Aby dodać klucz obcy do istniejącego odwołania , utwórz nową migrację, aby dodać klucz obcy:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Aby utworzyć całkowicie nowe odniesienie z kluczem obcym (w Rails 4.2) , wygeneruj migrację za pomocą następującego polecenia:
rails g migration AddUserToUploads user:references
który utworzy plik migracji jako:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Spowoduje to dodanie nowego klucza obcego do user_id
kolumny uploads
tabeli. Klucz odwołuje się do id
kolumny w users
tabeli.
UWAGA: Jest to dodatek do dodawania odwołania, więc nadal musisz najpierw utworzyć odniesienie, a następnie klucz obcy ( możesz wybrać utworzenie klucza obcego w tej samej migracji lub osobnym pliku migracji ). Active Record obsługuje tylko klucze obce jednokolumnowe i obecnie tylko mysql
, mysql2
a PostgreSQL
karty są obsługiwane. Nie próbuj tego z innymi adapterami, takimi jak sqlite3
, itp. Zapoznaj się z Przewodnikami po szynach: Klucze obce w celach informacyjnych.
rails g migration AddUserToUploads user:references
powodujeadd_reference :uploads, :user, index: true, foreign_key: true
odpowiednią migrację....index: true, foreign_key: true
zamiast o liniiadd_foreign_key
.foreign_key
it.reference
? Czyt.reference
zasadniczo nie jest równoważne zforiegn_key
+index
?Szyny 5
Nadal możesz użyć tego polecenia, aby utworzyć migrację:
Migracja wygląda nieco inaczej niż wcześniej, ale nadal działa:
Zauważ, że
:user
nie:user_id
źródło
Local::User
zamiastUser
robić coś podobnegorails g migration AddLocalUserToUploads user:references
.:index
t.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
belongs_to :user
wUpload
klasie, więc możemy użyćupload.user
, aby uzyskać instancję użytkownika.jeśli podoba Ci się inne alternatywne podejście
up
idown
metoda, spróbuj tego:źródło
[Korzystanie z Rails 5]
Generuj migrację:
Spowoduje to utworzenie pliku migracji:
Teraz, jeśli zaobserwujesz plik schematu, zobaczysz, że tabela przesyłania zawiera nowe pole. Coś w stylu:
t.bigint "user_id"
lubt.integer "user_id"
.Przeprowadź migrację bazy danych:
źródło
Inną składnią robienia tego samego jest:
źródło
Aby udokumentować, czy ktoś ma ten sam problem ...
W mojej sytuacji używam
:uuid
pól, a powyższe odpowiedzi nie działają w moim przypadku, ponieważ szyny 5 tworzą kolumnę, używając:bigint
zamiast tego:uuid
:źródło
Utwórz plik migracji
Domyślna nazwa klucza obcego
Spowoduje to utworzenie kolumny user_id w tabeli przesyłania jako klucza obcego
model użytkownika:
prześlij model:
Dostosuj nazwę klucza obcego:
Spowoduje to utworzenie kolumny autor_id w tabelach przesyłania jako klucza obcego.
model użytkownika:
prześlij model:
źródło