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