Agregar una migración de columna de referencia en Rails 4


Un usuario tiene muchas cargas. Quiero añadir una columna a la tabla uploads que haga referencia a la user. ¿Cómo debería ser la migración?

Esto es lo que tengo. No estoy seguro de si debo usar (1) :user_id, :int o (2) :user, :references. Ni siquiera estoy seguro de si (2) funciona. Solo trato de hacer esto de la manera" rails".

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

Pregunta relevante excepto para Rails 3. Migraciones de Rails 3: ¿Añadiendo la columna de referencia?

Author: Community, 2014-04-02

5 answers

Rieles 4.x

Cuando ya han users y uploads tablas y desea añadir una nueva relación entre ellos.

Todo lo que necesita hacer es: generar una migración usando el siguiente comando:

rails g migration AddUserToUploads user:references

Que creará un archivo de migración como:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
  end
end

Luego, ejecute la migración usando rake db:migrate. Esta migración se encargará de agregar una nueva columna llamada user_id a la tabla uploads (haciendo referencia a la columna id en la tabla users), MÁS también agregará un índice en la nueva columna.

ACTUALIZACIÓN [Para Rails 4.2]

No se puede confiar en Rails para mantener la integridad referencial; las bases de datos relacionales vienen a nuestro rescate aquí. Lo que eso significa es que podemos agregar restricciones de clave foránea a nivel de base de datos y asegurarnos de que la base de datos rechace cualquier operación que viole esta integridad referencial del conjunto. Como comentó @infoget, Rails 4.2 viene con soporte nativo para claves foráneas(integridad referencial). No es necesario, pero es posible que desee agregar clave foránea (ya que es muy útil) a la referencia que creamos anteriormente.

Para agregar una clave foránea a una referencia existente , cree una nueva migración para agregar una clave foránea:

class AddForeignKeyToUploads < ActiveRecord::Migration
  def change
    add_foreign_key :uploads, :users
  end
end

Para crear una referencia completamente nueva con una clave foránea(en Rails 4.2), genere una migración usando el siguiente comando:

rails g migration AddUserToUploads user:references

Que creará un archivo de migración as:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
    add_foreign_key :uploads, :users
  end
end

Esto agregará una nueva clave foránea a la columna user_id de la tabla uploads. La clave hace referencia a la columna id en la tabla users.

NOTA: Esto es además de agregar una referencia, por lo que aún necesita crear una referencia primero y luego una clave externa (puede elegir crear una clave foránea en la misma migración o un archivo de migración separado ). Active Record solo admite claves foráneas de una sola columna y actualmente solo mysql, mysql2 y PostgreSQL se admiten adaptadores. No intente esto con otros adaptadores como sqlite3, etc. Consulte Rails Guides: Foreign Keys para su referencia.

 577
Author: Kirti Thorat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-10 05:38:04

Carriles 5

Todavía puede usar este comando para crear la migración:

rails g migration AddUserToUploads user:references

La migración se ve un poco diferente a antes, pero aún funciona:

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

Tenga en cuenta que es :user, no :user_id

 136
Author: Mirror318,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-15 04:11:06

Si te gusta otro enfoque alternativo con el método up y down prueba esto:

  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
 5
Author: Kiry Meas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-30 03:44:38

[Uso de Rails 5]

Generar migración:

rails generate migration add_user_reference_to_uploads user:references

Esto creará el archivo de migración:

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

Ahora, si observa el archivo de esquema, verá que la tabla uploads contiene un nuevo campo. Algo así como: t.bigint "user_id" o t.integer "user_id".

Migrar base de datos:

rails db:migrate
 4
Author: vantony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-23 11:01:23

Otra sintaxis para hacer lo mismo es:

rails g migration AddUserToUpload user:belongs_to
 3
Author: Nadeem Yasin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-27 19:01:19