Schienen 4.x.
Wenn Sie bereits Tabellen habenusers
und eine neue Beziehung zwischen ihnen hinzufügenuploads
möchten .
Alles, was Sie tun müssen, ist: Generieren Sie einfach eine Migration mit dem folgenden Befehl:
rails g migration AddUserToUploads user:references
Welches erstellt eine Migrationsdatei als:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Führen Sie dann die Migration mit aus rake db:migrate
. Diese Migration kümmert sich um eine neue Spalte hinzuzufügen Namen user_id
zu uploads
Tabelle (Referenzierung id
Spalt in users
Tabelle), PLUS wird es auch einen Index für die neue Spalte hinzuzufügen.
UPDATE [Für Schienen 4.2]
Rails kann nicht als vertrauenswürdig eingestuft werden, um die referenzielle Integrität aufrechtzuerhalten. Hier helfen uns relationale Datenbanken . Dies bedeutet, dass wir auf Datenbankebene selbst Fremdschlüsseleinschränkungen hinzufügen und sicherstellen können, dass die Datenbank alle Vorgänge ablehnt, die diese referenzielle Integrität verletzen. Wie @infoget kommentierte, wird Rails 4.2 mit nativer Unterstützung für Fremdschlüssel geliefert (referenzielle Integrität) . Es ist nicht erforderlich, aber Sie möchten möglicherweise einen Fremdschlüssel (da dies sehr nützlich ist) zu der oben erstellten Referenz hinzufügen.
Um einer vorhandenen Referenz einen Fremdschlüssel hinzuzufügen, erstellen Sie eine neue Migration, um einen Fremdschlüssel hinzuzufügen:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Um eine völlig neue Referenz mit einem Fremdschlüssel (in Rails 4.2) zu erstellen , generieren Sie eine Migration mit dem folgenden Befehl:
rails g migration AddUserToUploads user:references
Dadurch wird eine Migrationsdatei erstellt als:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Dadurch wird der user_id
Spalte der uploads
Tabelle ein neuer Fremdschlüssel hinzugefügt . Der Schlüssel verweist auf die id
Spalte in der users
Tabelle.
HINWEIS: Dies ist zusätzlich zum Hinzufügen einer Referenz erforderlich, sodass Sie zuerst eine Referenz und dann einen Fremdschlüssel erstellen müssen ( Sie können wählen, ob Sie einen Fremdschlüssel in derselben Migration oder in einer separaten Migrationsdatei erstellen möchten ). Active Record unterstützt nur einzelne Spalte Fremdschlüssel und zur Zeit nur mysql
, mysql2
und PostgreSQL
Adapter werden unterstützt. Versuchen Sie dies nicht mit anderen Adaptern wie sqlite3
usw. Siehe Rails Guides: Foreign Keys als Referenz.
rails g migration AddUserToUploads user:references
erzeugtadd_reference :uploads, :user, index: true, foreign_key: true
in der entsprechenden Migration....index: true, foreign_key: true
stattdessen o lineadd_foreign_key
.foreign_key
undt.reference
? Ist nicht imt.reference
Wesentlichen gleichbedeutend mitforiegn_key
+index
?Schienen 5
Mit diesem Befehl können Sie weiterhin die Migration erstellen:
Die Migration sieht etwas anders aus als zuvor, funktioniert aber immer noch:
Beachten Sie
:user
, dass dies nicht der Fall ist:user_id
quelle
Local::User
anstattUser
etwas zu tunrails g migration AddLocalUserToUploads user:references
.:index
t.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
belongs_to :user
in derUpload
Klasse, so können wir verwendenupload.user
die Benutzerinstanz zu lernen.Wenn Sie einen anderen alternativen Ansatz mit
up
unddown
Methode mögen , versuchen Sie Folgendes:quelle
[Verwenden von Schienen 5]
Migration generieren:
Dadurch wird die Migrationsdatei erstellt:
Wenn Sie nun die Schemadatei beobachten, sehen Sie, dass die Upload-Tabelle ein neues Feld enthält. So etwas wie:
t.bigint "user_id"
odert.integer "user_id"
.Datenbank migrieren:
quelle
Eine andere Syntax, um dasselbe zu tun, lautet:
quelle
Nur um zu dokumentieren, ob jemand das gleiche Problem hat ...
In meiner Situation habe ich
:uuid
Felder verwendet, und die obigen Antworten funktionieren in meinem Fall nicht, da Schienen 5:bigint
stattdessen eine Spalte mit folgenden Elementen erstellen:uuid
:quelle
Erstellen Sie eine Migrationsdatei
Standard-Fremdschlüsselname
Dies würde eine user_id-Spalte in der Upload-Tabelle als Fremdschlüssel erstellen
Benutzermodell:
Modell hochladen:
Anpassen des Fremdschlüsselnamens:
Dies würde eine author_id-Spalte in den Upload-Tabellen als Fremdschlüssel erstellen.
Benutzermodell:
Modell hochladen:
quelle