Rails 3 migraciones: ¿Agregar columna de referencia?

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 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 Rails desde la línea de comando?

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 Rails

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

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 

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 

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 

Al agregar una columna, debe hacer que esa columna sea un número entero y, si es posible, seguir las convenciones de los Rails. 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 

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

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