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