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.