mysql - secundaria - Cómo agregar una clave externa en la migración de rieles con un nombre de tabla diferente
llave foranea compuesta mysql (3)
¿Cómo puedo asignar un nombre de tabla diferente al agregar una clave externa? por ejemplo
Tengo un modelo como
class MyPost < ActiveRecord::Base
has_many :comments, class_name: PostComment
end
class PostComment < ActiveRecord::Base
belongs_to :post, class_name: MyPost
end
Ahora quiero cambiar mi archivo de migración de esta manera:
class CreatePostComments < ActiveRecord::Migration
def change
create_table :post_comments do |t|
t.belongs_to :post, index: true
t.timestamps null: false
end
add_foreign_key :post, :class_name => MyPost
end
end
Pero no está funcionando. La migración está siendo cancelada. ¿Cómo cambio mi archivo de migración para que funcione con la estructura de mi modelo?
Debe tener un aspecto como este:
class CreatePostComments < ActiveRecord::Migration
def change
create_table :post_comments do |t|
t.belongs_to :post, index: true
t.timestamps null: false
end
add_foreign_key :post_comments, :my_posts, column: :post_id
end
end
Eche un vistazo a la documentación: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_foreign_key
Utiliza la opción de column
cuando la columna tiene un nombre diferente.
Prueba esto
class CreatePostComments < ActiveRecord::Migration
def change
create_table :post_comments do |t|
t.references :my_post, index: true
t.timestamps null: false
end
add_foreign_key :my_post, :post_comments
end
end
Puede pasar opciones para la clave externa de la siguiente manera:
class CreatePostComments < ActiveRecord::Migration
def change
create_table :post_comments do |t|
t.references :post, foreign_key: { to_table: :my_posts }, index: true
t.timestamps null: false
end
end
end
Esto también es cierto para la opción de índice si desea agregar una restricción única:
t.references :post, foreign_key: { to_table: :my_posts }, index: { unique: true}
Por cierto: references es un alias para belongs_to, o para ser más exactos, belongs_to es un alias para referencias.
Ver los detalles en la implementación:
rails 5.0.rc2: https://github.com/rails/rails/blob/v5.0.0.rc2/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L68