Carriles 4.x
Cuando ya tienes users
y uploads
mesas 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
Lo 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
auploads
tabla (haciendo referencia a la id
columna en la users
tabla), ADEMÁS, también agregará un índice en la nueva columna.
ACTUALIZACIÓN [Para Rails 4.2]
No se puede confiar en los rieles para mantener la integridad referencial; bases de datos relacionales vienen a nuestro rescate aquí. Lo que eso significa es que podemos agregar restricciones de clave externa en el nivel de la base de datos y garantizar que la base de datos rechace cualquier operación que viole esta integridad referencial establecida. Como comentó @infoget, Rails 4.2 viene con soporte nativo para claves foráneas (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 foránea (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 user_id
columna de la uploads
tabla. La clave hace referencia a la id
columna en la users
tabla.
NOTA: Esto es además de agregar una referencia, por lo que aún debe crear una referencia primero y luego una clave externa ( puede elegir crear una clave externa en la misma migración o en un archivo de migración separado ). Active Record solo admite claves foráneas de una sola columna y actualmente solo mysql
, mysql2
y los PostgreSQL
adaptadores son compatibles. No intente esto con otros adaptadores como sqlite3
, etc. Consulte las guías de Rails: claves externas para su referencia.
rails g migration AddUserToUploads user:references
produceadd_reference :uploads, :user, index: true, foreign_key: true
en la migración adecuada....index: true, foreign_key: true
lugar o líneaadd_foreign_key
.foreign_key
yt.reference
? ¿No est.reference
esencialmente equivalente aforiegn_key
+index
?Carriles 5
Todavía puede usar este comando para crear la migración:
La migración se ve un poco diferente a la anterior, pero aún funciona:
Tenga en cuenta que es
:user
, no:user_id
fuente
Local::User
lugar deUser
hacer algo comorails g migration AddLocalUserToUploads user:references
.:index
t.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
belongs_to :user
enUpload
clase, para que podamos usarupload.user
para obtener la instancia de usuario.si desea otro enfoque
up
ydown
método alternativos , pruebe esto:fuente
[Usando Rails 5]
Generar migración:
Esto creará el archivo de migración:
Ahora, si observa el archivo de esquema, verá que la tabla de cargas contiene un nuevo campo. Algo así como:
t.bigint "user_id"
ot.integer "user_id"
.Migrar base de datos:
fuente
Otra sintaxis de hacer lo mismo es:
fuente
Solo para documentar si alguien tiene el mismo problema ...
En mi situación, he estado usando
:uuid
campos, y las respuestas anteriores no funcionan para mi caso, porque los rieles 5 están creando una columna usando en su:bigint
lugar:uuid
:fuente
Crear un archivo de migración
Nombre de clave externa predeterminada
Esto crearía una columna user_id en la tabla de cargas como una clave foránea
modelo de usuario:
cargar modelo:
Personalizar nombre de clave externa:
Esto crearía una columna author_id en las tablas de cargas como la clave foránea.
modelo de usuario:
cargar modelo:
fuente