regresar rails migraciones migracion llaves hacer foraneas especifica eliminar ejecutar deshacer crear columna ruby-on-rails ruby-on-rails-4 rails-activerecord rails-migrations

ruby on rails - migraciones - Agregar una migración de columna de referencia en Rails 4



migracion en rails (6)

Carriles 5

Aún puedes usar este comando para crear la migración:

rails g migration AddUserToUploads user:references

La migración se ve un poco diferente a la anterior, 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

Un usuario tiene muchas subidas. Quiero agregar una columna a la tabla de uploads que hace referencia al user . ¿Cómo debería ser la migración?

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

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

Pregunta relevante, excepto para Rails 3. Migraciones de Rails 3: ¿Agregar una columna de referencia?


Otra sintaxis de hacer lo mismo es:

rails g migration AddUserToUpload user:belongs_to


Si te gusta otro enfoque alternativo con 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


Solo para documentar si alguien tiene el mismo problema ...

En mi situación, he estado usando :uuid campos :uuid , y las respuestas anteriores no funcionan en mi caso, porque los rieles 5 están creando una columna usando :bigint lugar :uuid :

add_column :uploads, :user_id, :uuid add_index :uploads, :user_id add_foreign_key :uploads, :users


Rieles 4.x

Cuando ya tiene users y uploads tablas y desea agregar una nueva relación entre ellos.

Todo lo que necesita hacer es: simplemente generar una migración con 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 denominada user_id a las tablas de uploads (haciendo referencia a la columna de id en la tabla de users ), MÁS también agregará un índice en la nueva columna.

ACTUALIZACIÓN [Para Rieles 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 en el nivel de la base de datos y asegurarnos de que la base de datos rechace cualquier operación que viole la integridad referencial de este conjunto. Como comentó @infoget, Rails 4.2 se entrega con soporte nativo para claves externas (integridad referencial) . No es obligatorio, pero es posible que desee agregar una clave externa (ya que es muy útil) a la referencia que creamos anteriormente.

Para agregar una clave externa a una referencia existente , cree una nueva migración para agregar una clave externa:

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

Para crear una referencia completamente nueva con una clave externa (en Rails 4.2) , genere una migración con 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 add_foreign_key :uploads, :users end end

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

NOTA: Esto es además de agregar una referencia, por lo que aún debe crear una referencia primero y luego una clave foránea ( puede elegir crear una clave foránea en la misma migración o en un archivo de migración independiente ). Active Record solo admite claves externas de una sola columna y actualmente solo se mysql2 adaptadores mysql , mysql2 y PostgreSQL . No intente esto con otros adaptadores como sqlite3 , etc. Consulte las Guías de Rieles: Claves foráneas para su referencia.


[Usando 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 de cargas contiene un nuevo campo. Algo como: t.bigint "user_id" o t.integer "user_id" .

Migrar base de datos:

rails db:migrate