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?
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.
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
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
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
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
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