Rotaie 4.x
Quando hai già users
e uploads
tabelle e desideri aggiungere una nuova relazione tra di loro.
Tutto quello che devi fare è: basta generare una migrazione usando il seguente comando:
rails g migration AddUserToUploads user:references
Che creerà un file di migrazione come:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Quindi, eseguire la migrazione utilizzando rake db:migrate
. Questa migrazione si occuperà dell'aggiunta di una nuova colonna denominata user_id
nella uploads
tabella (facendo riferimento alla id
colonna nella users
tabella), INOLTRE aggiungerà anche un indice sulla nuova colonna.
AGGIORNAMENTO [For Rails 4.2]
Non ci si può fidare delle rotaie per mantenere l'integrità referenziale; database relazionali vengono in nostro soccorso qui. Ciò significa che possiamo aggiungere vincoli di chiave esterna a livello del database stesso e garantire che il database respingerebbe qualsiasi operazione che viola questa serie integrità referenziale. Come ha commentato @infoget, Rails 4.2 viene fornito con supporto nativo per le chiavi esterne (integrità referenziale) . Non è richiesto ma potresti voler aggiungere una chiave esterna (poiché è molto utile) al riferimento che abbiamo creato sopra.
Per aggiungere una chiave esterna a un riferimento esistente , creare una nuova migrazione per aggiungere una chiave esterna:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Per creare un riferimento completamente nuovo con una chiave esterna (in Rails 4.2) , generare una migrazione utilizzando il comando seguente:
rails g migration AddUserToUploads user:references
che creerà un file di migrazione come:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Ciò aggiungerà una nuova chiave esterna alla user_id
colonna della uploads
tabella. La chiave fa riferimento alla id
colonna nella users
tabella.
NOTA: questo è in aggiunta all'aggiunta di un riferimento, quindi è ancora necessario creare prima un riferimento, quindi una chiave esterna ( è possibile scegliere di creare una chiave esterna nella stessa migrazione o in un file di migrazione separato ). Attivo Record supporta solo a colonna singola chiavi esterne e attualmente solo mysql
, mysql2
e PostgreSQL
sono supportati gli adattatori. Non provarlo con altri adattatori come sqlite3
, ecc. Fare riferimento a Guide Rails: chiavi esterne per riferimento.