ruby on rails - llaves - Rails 3 migraciones: ¿Agregar columna de referencia?
migracion en rails (10)
Al agregar una columna, debe hacer que esa columna sea un número entero y, si es posible, seguir las convenciones de los rieles. Entonces, para su caso, supongo que ya tiene un Tester y modelos de usuario, y tablas de probadores y usuarios.
Para agregar la clave externa, necesita crear una columna entera con el nombre user_id (convención):
add_column :tester, :user_id, :integer
A continuación, agregue un belongs_to al modelo del probador:
class Tester < ActiveRecord::Base
belongs_to :user
end
Y es posible que también desee agregar un índice para la clave externa (esto es algo que las referencias ya le hacen):
add_index :tester, :user_id
Si creo una nueva migración de rieles 3 con (por ejemplo)
rails g migration tester title:tester user:references
, todo funciona bien ... sin embargo, si agrego una columna con algo como:
rails g migration add_user_to_tester user:references
el campo de referencia no es reconocido. En resumen, la pregunta es: ¿cómo agrego una columna de referencia a una migración de rieles desde la línea de comando?
Con los dos pasos anteriores indicados anteriormente, aún no aparece la restricción de clave externa. Esto debería funcionar:
class AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer, references: :users
end
end
Eso hará el truco:
rails g migration add_user_to_tester user_id:integer:index
Puede agregar referencias a su modelo a través de la línea de comando de la siguiente manera:
rails g migration add_column_to_tester user_id:integer
Esto generará un archivo de migración como:
class AddColumnToTesters < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
end
end
Esto funciona bien cada vez que lo uso ..
Puede usar referencias en una migración de cambio. Este es un código válido de Rails 3.2.13:
class AddUserToTester < ActiveRecord::Migration
def change
change_table :testers do |t|
t.references :user, index: true
end
end
def down
change_table :testers do |t|
t.remove :user_id
end
end
end
cf: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
Running rails g migration AddUserRefToSponsors user:references
generarán la siguiente migración:
def change
add_reference :sponsors, :user, index: true
end
Si está utilizando Rails 4.x ahora puede generar migraciones con referencias, como esta:
rails generate migration AddUserRefToProducts user:references
como se puede ver en las guías de rieles
Tenga en cuenta que lo más probable es que también necesite un índice en esa columna.
class AddUserReferenceToTester < ActiveRecord::Migration
def change
add_column :testers, :user_id, :integer
add_index :testers, :user_id
end
end
EDITAR : Esta es una respuesta desactualizada y no debe aplicarse a Rails 4.x +
No necesita agregar referencias cuando puede usar un ID entero para su clase referenciada.
Diría que la ventaja de utilizar referencias en lugar de un entero simple es que el modelo estará predefinido con belongs_to y dado que el modelo ya está creado y no se verá afectado cuando migre algo existente, el propósito es como perderse.
Así que me gustaría hacer esto en su lugar:
rails g migration add_user_id_to_tester user_id:integer
Y luego agregue manualmente belongs_to: user en el modelo de Tester
Para Rails 4
El generador acepta el tipo de columna como referencias (también disponible como belongs_to
).
Esta migración creará una columna user_id
y un índice apropiado:
$ rails g migration AddUserRefToProducts user:references
genera:
class AddUserRefToProducts < ActiveRecord::Migration
def change
add_reference :products, :user, index: true
end
end
http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration
Para Rails 3
Helper se llama referencias (también disponible como belongs_to
).
Esta migración creará una columna category_id
del tipo apropiado. Tenga en cuenta que pasa el nombre del modelo, no el nombre de la columna. Active Record agrega _id
para usted.
change_table :products do |t|
t.references :category
end
Si tiene asociaciones belongs_to
asociaciones polimórficas, entonces las referencias agregarán las dos columnas requeridas:
change_table :products do |t|
t.references :attachment, :polymorphic => {:default => ''Photo''}
end
Agregará una columna attachment_id y una columna attachment_type
column con un valor predeterminado de Photo
.
http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration