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)