Comment puis-je attribuer un nom de table différent avec l'ajout d'une clé étrangère. par exemple
J'ai un modèle comme
class MyPost < ActiveRecord::Base
has_many :comments, class_name: PostComment
end
class PostComment < ActiveRecord::Base
belongs_to :post, class_name: MyPost
end
Maintenant, je veux changer mon fichier de migration comme ceci:
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
Mais ça ne fonctionne pas. La migration est annulée. Comment modifier mon fichier de migration pour qu'il fonctionne avec ma structure de modèle.
Vous pouvez transmettre des options pour la clé étrangère comme suit:
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
Cela est également vrai pour l'option d'index si vous souhaitez ajouter une contrainte unique:
t.references :post, foreign_key: { to_table: :my_posts }, index: { unique: true}
Soit dit en passant, références est un alias pour belongs_to
, ou pour être plus précis, belongs_to
est un alias pour les références.
Voir les détails dans l'implémentation Rails 5.0.rc2 & Rails 4.2
Ça devrait ressembler à ça:
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
Jetez un œil à la documentation: http://apidock.com/Rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_foreign_key
Vous utilisez l'option column
lorsque la colonne est nommée différemment.