una tabla secundaria restricción puede llave insertar indice foranea fila falla externa error encontrado datos creada con compuesta como columnas clave agregar actualizar mysql ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 rails-migrations

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

rails 4.2: https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L312