regresar rails migraciones migracion llaves hacer foraneas especifica eliminar ejecutar deshacer crear columna ruby-on-rails activerecord migration

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



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