it-swarm.com.de

Fügen Sie eine Referenzspaltenmigration in Rails 4 hinzu

Ein Benutzer hat viele Uploads. Ich möchte der Tabelle uploads eine Spalte hinzufügen, die auf user verweist. Wie soll die Migration aussehen?

Hier ist was ich habe. Ich bin mir nicht sicher, ob ich (1) :user_id, :int oder (2) :user, :references verwenden soll. Ich bin mir nicht mal sicher, ob (2) funktioniert. Ich versuche nur, dies auf die "Rails" Weise zu tun.

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_column :uploads, :user_id, :integer
  end
end

Relevante Frage außer für Rails 3. Rails 3-Migrationen: Hinzufügen einer Referenzspalte?

289
Don P

Schienen 4.x

Wenn Sie bereits users und uploads Tabellen haben und eine neue Beziehung hinzufügen möchten zwischen ihnen.

Alles, was Sie tun müssen, ist: Generieren Sie einfach eine Migration mit dem folgenden Befehl:

Rails g migration AddUserToUploads user:references

Welche 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 rake db:migrate aus. Bei dieser Migration wird eine neue Spalte mit dem Namen user_id zur Tabelle uploads hinzugefügt (wobei auf die Spalte id in der Tabelle users verwiesen wird). Außerdem wird ein Index für die neue Spalte hinzugefügt Säule.

UPDATE [Für Rails 4.2]

Rails kann nicht als vertrauenswürdig eingestuft werden, um die referenzielle Integrität aufrechtzuerhalten. relationale Datenbanken retten uns hier. Das bedeutet, dass wir Fremdschlüsseleinschränkungen auf der Datenbankebene selbst hinzufügen können und sicherstellen können, dass die Datenbank alle Vorgänge ablehnt, die diese festgelegte referenzielle Integrität verletzen. Wie @infoget kommentierte, wird Rails 4.2 mit systemeigener Unterstützung für Fremdschlüssel (referentielle Integrität) ausgeliefert. Dies ist nicht erforderlich, aber Sie können der oben erstellten Referenz einen Fremdschlüssel hinzufügen (da dies sehr nützlich ist).

Um einem vorhandenen Verweis 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 vollständig brandneue Referenz mit einem Fremdschlüssel zu erstellen (in Rails 4.2) , 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 Spalte user_id der Tabelle uploads ein neuer Fremdschlüssel hinzugefügt. Der Schlüssel verweist auf die Spalte id in der Tabelle users.

HINWEIS: Zusätzlich zum Hinzufügen einer Referenz müssen Sie noch eine Referenz und dann einen Fremdschlüssel erstellen ( Sie können wählen, ob Sie einen Fremdschlüssel in derselben Migration oder eine separate Migrationsdatei erstellen möchten. Active Record unterstützt nur einspaltige Fremdschlüssel. Derzeit werden nur die Adapter mysql, mysql2 und PostgreSQL unterstützt. Versuchen Sie dies nicht mit anderen Adaptern wie sqlite3 usw. Siehe Rails Guides: Foreign Keys als Referenz.

661
Kirti Thorat

Schienen 5

Sie können diesen Befehl weiterhin verwenden, um die Migration zu erstellen:

Rails g migration AddUserToUploads user:references

Die Migration sieht ein bisschen anders aus, funktioniert aber trotzdem:

class AddUserToUploads < ActiveRecord::Migration[5.0]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

Beachten Sie, dass es :user ist, nicht :user_id

165
Mirror318

wenn Sie einen anderen alternativen Ansatz mit der Methode up und down bevorzugen, versuchen Sie Folgendes:

  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
15
Kiry Meas

[Using Rails 5]

Migration generieren:

Rails generate migration add_user_reference_to_uploads user:references

Dadurch wird die Migrationsdatei erstellt:

class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

Wenn Sie nun die Schemadatei beobachten, sehen Sie, dass die Upload-Tabelle ein neues Feld enthält. Etwas wie: t.bigint "user_id" oder t.integer "user_id".

Datenbank migrieren:

Rails db:migrate
9
vantony

Eine andere Syntax für dasselbe ist:

Rails g migration AddUserToUpload user:belongs_to
7
Nadeem Yasin

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 Rails 5 eine Spalte mit :bigint anstelle von :uuid erstellt:

add_column :uploads, :user_id, :uuid
add_index :uploads, :user_id
add_foreign_key :uploads, :users
4
Bruno Casali