web-dev-qa-db-fra.com

Comment ajouter une clé étrangère dans Rails migration avec un nom de table différent

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.

17
Braham Shakti

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

31
Stefan Staub

Ç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.

14
lunr