Dodaj migrację kolumny referencyjnej w Rails 4
Użytkownik ma wiele uploadów. Chcę dodać kolumnę do tabeli uploads
, która odwołuje się do user
. Jak powinna wyglądać migracja?
:user_id, :int
Czy (2) :user, :references
. Nie jestem nawet pewien, czy (2) działa. Po prostu staram się to zrobić "rails" sposób.
class AddUserToUploads < ActiveRecord::Migration
def change
add_column :uploads, :user_id, :integer
end
end
Istotne pytanie z wyjątkiem Rails 3. migracje Rails 3: dodanie kolumny referencyjnej?
5 answers
Rails 4.x
Kiedy już masz users
i uploads
tabele i chcą dodać między nimi nową relację.
Wystarczy 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 Tabeli uploads
(odwołanie się do kolumny id
w tabeli users
), PLUS spowoduje to również dodanie indeksu do nowej kolumny.
Aktualizacja [dla Rails 4.2]
Rails nie może być zaufany w utrzymaniu integralności referencji; relacyjne bazy danych przychodzą nam na ratunek. Oznacza to, że możemy dodać ograniczenia klucza obcego na poziomie bazy danych i upewnić się, że baza danych odrzuci każdą operację, która narusza ten zestaw referencyjnej integralności. Jak skomentował @infoget, Rails 4.2 oferuje natywne wsparcie dla klucze obce (integralność odniesienia) . Nie jest to wymagane, ale możesz chcieć dodać klucz obcy (ponieważ jest bardzo przydatny) do odniesienia, które stworzyliśmy powyżej.
Aby dodać klucz obcy do istniejącego odniesienia, 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 obcym kluczem(w Rails 4.2) , Wygeneruj migrację używając następującego polecenia:
rails g migration AddUserToUploads user:references
Który utworzy plik migracji as:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Spowoduje dodanie nowego klucza obcego do kolumny user_id
tabeli uploads
. Klucz odwołuje się do kolumny id
w tabeli users
.
Uwaga: jest to dodatek do dodawania referencji, więc nadal musisz najpierw utworzyć referencję, a następnie klucz obcy (możesz utworzyć klucz obcy w tej samej migracji lub oddzielnym pliku migracji). Active Record obsługuje tylko jednokolumnowe klucze obce i obecnie tylko mysql
, mysql2
oraz PostgreSQL
adaptery są obsługiwane. Nie próbuj tego z innymi adapterami, takimi jak sqlite3
itp. Zobacz Rails Guides: Foreign Keys w celach informacyjnych.
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-01-10 05:38:04
Rails 5
Nadal możesz użyć tego polecenia do utworzenia migracji:
rails g migration AddUserToUploads user:references
Migracja wygląda nieco inaczej niż wcześniej, ale nadal działa:
class AddUserToUploads < ActiveRecord::Migration[5.0]
def change
add_reference :uploads, :user, foreign_key: true
end
end
Zauważ, że to :user
, a nie :user_id
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
2016-09-15 04:11:06
Jeśli lubisz inne alternatywne podejście metodą up
i down
Spróbuj tego:
def up
change_table :uploads do |t|
t.references :user, index: true
end
end
def down
change_table :uploads do |t|
t.remove_references :user, index: true
end
end
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-30 03:44:38
[Korzystanie Z Rails 5]
Wygeneruj migrację:
rails generate migration add_user_reference_to_uploads user:references
Spowoduje utworzenie pliku migracji:
class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
def change
add_reference :uploads, :user, foreign_key: true
end
end
Teraz, jeśli zauważysz plik schematu, zobaczysz, że tabela przesłanych plików zawiera nowe pole. Coś w stylu: t.bigint "user_id"
lub t.integer "user_id"
.
Migracja bazy danych:
rails db:migrate
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-10-23 11:01:23
Inna składnia robienia tego samego to:
rails g migration AddUserToUpload user:belongs_to
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-05-27 19:01:19