Si creo una nueva migración de rails 3 con (por ejemplo)
rails g migration tester title:tester user:references
, todo funciona bien ... sin embargo, si agrego una columna con algo similar a:
rails g migration add_user_to_tester user:references
el campo de referencia no se reconoce. En resumen, la pregunta es: ¿cómo agrego una columna de referencia a una migración de rieles desde la línea de comandos?
ruby-on-rails
activerecord
migration
Plancton
fuente
fuente
EDITAR : Esta es una respuesta obsoleta y no debe aplicarse a Rails 4.x +
No necesita agregar referencias cuando puede usar una identificación entera para su clase referenciada.
Diría que la ventaja de usar referencias en lugar de un entero simple es que el modelo estará predefinido con belong_to y dado que el modelo ya está creado y no se verá afectado cuando migre algo existente, el propósito se pierde.
Entonces me gustaría hacer esto en su lugar:
Y luego agregue manualmente belong_to: usuario en el modelo Tester
fuente
Tenga en cuenta que probablemente también necesitará un índice en esa columna.
fuente
user.testers
, puede omitir el índice.rails g migration ...
generadoadd_reference :installs, :device, index: true
que también crea el índice.Con los dos pasos anteriores indicados anteriormente, todavía te falta la restricción de clave externa. Esto debería funcionar:
fuente
Usted puede utilizar referencias en una migración cambio. Este es el código válido de Rails 3.2.13:
cf: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
fuente
down
método, obtuveActiveRecord::IrreversibleMigration
al retroceder usando Rails 3.2. También he tenido que cambiarchange
aup
.La ejecución
rails g migration AddUserRefToSponsors user:references
generará la siguiente migración:fuente
Al agregar una columna, debe hacer que esa columna sea un número entero y, si es posible, cumplir con las convenciones de rieles. Entonces, para su caso, supongo que ya tiene un Tester y modelos de usuario, y testers y tablas de usuarios.
Para agregar la clave externa, debe crear una columna entera con el nombre user_id (convención):
A continuación, agregue un pertenece_ al modelo de prueba:
Y es posible que también desee agregar un índice para la clave externa (esto es algo que las referencias ya hacen por usted):
fuente
Eso hará el truco:
fuente
Puede agregar referencias a su modelo a través de la línea de comandos de la siguiente manera:
Esto generará un archivo de migración como:
Esto funciona bien cada vez que lo uso ...
fuente
Para rieles 4
El generador acepta el tipo de columna como referencias (también disponible como
belongs_to
).Esta migración creará una
user_id
columna y un índice apropiado:genera:
http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration
Para rieles 3
Helper se llama referencias (también disponible como
belongs_to
).Esta migración creará una
category_id
columna del tipo apropiado. Tenga en cuenta que pasa el nombre del modelo, no el nombre de la columna. Active Record agrega el_id
para usted.Si tiene
belongs_to
asociaciones polimórficas , las referencias agregarán las dos columnas requeridas:Agregará una columna attach_id y una
attachment_type
columna de cadena con un valor predeterminado dePhoto
.http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration
fuente