run remove rails migrations generate data column ruby-on-rails ruby-on-rails-3 activerecord rails-migrations

ruby-on-rails - remove - rollback migration rails



Especificando el nombre de la columna en una migraciĆ³n de "referencias" (6)

Quiero hacer una migration en Rails, haciendo referencia a otra tabla. Por lo general, haría algo como:

add_column :post, :user, :references

Esto crea una columna llamada user_id en la tabla de posts . Pero, ¿y si, en lugar de user_id , quisiera algo como author_id ? ¿Cómo puedo hacer eso?


Para Rails 5+

Definición inicial:

Si está definiendo su tabla de modelo de Post , puede establecer references , index y foreign_key en una línea:

t.references :author, index: true, foreign_key: { to_table: :users }

Actualización existente:

Si está agregando referencias a una tabla existente, puede hacer esto:

add_reference :posts, :author, foreign_key: { to_table: :users }

Nota: El valor predeterminado para el index es verdadero.


En Rails 4.2+ también puede establecer claves externas en el db, lo cual es una gran idea .

Para asociaciones simples esto se puede hacer también en t.references añadiendo foreign_key: true , pero en este caso necesitarás dos líneas.

# The migration add_reference :posts, :author, index: true add_foreign_key :posts, :users, column: :author_id # The model belongs_to :author, class_name: "User"


En los rieles 4, al usar postgresql y la gema schema_plus puedes escribir

add_reference :posts, :author, references: :users

Esto creará una columna author_id , que se refiere correctamente a los users(id) .

Y en tu modelo, escribes

belongs_to :author, class_name: "User"


Hágalo manualmente:

add_column :post, :author_id, :integer

pero ahora, cuando crea la instrucción belongs_to, tendrá que modificarla, por lo que ahora tiene que llamar

def post belongs_to :user, :foreign_key => ''author_id'' end


Si no está utilizando una clave externa, entonces no importa cuál sea el nombre de tabla real de la otra tabla.

add_reference :posts, :author

A partir de Rails 5 , si está utilizando una clave externa, puede especificar el nombre de la otra tabla en las opciones de clave externa. (ver https://github.com/rails/rails/issues/21563 para la discusión)

add_reference :posts, :author, foreign_key: {to_table: :users}

Antes de Rails 5, debe agregar la clave externa como un paso separado:

add_foreign_key :posts, :users, column: :author_id


alias_attribute (new_name, old_name) es muy útil. Solo crea tu modelo y la relación:

rails g model Post title user:references

luego edite el modelo y agregue un alias de atributo con

alias_attribute :author, :user

Después de eso podrás ejecutar cosas como

Post.new(title: ''My beautiful story'', author: User.first)