web-dev-qa-db-ja.com

Rails異なるテーブル名での移行に外部キーを追加する方法

外部キーを追加して別のテーブル名を割り当てるにはどうすればよいですか。例えば

私のようなモデルがあります

class MyPost < ActiveRecord::Base
  has_many :comments, class_name: PostComment
end

class PostComment < ActiveRecord::Base
  belongs_to :post, class_name: MyPost
end

次に、移行ファイルを次のように変更します。

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 

しかし、それは機能していません。移行をキャンセルしています。モデル構造で動作するように移行ファイルを変更するにはどうすればよいですか。

17
Braham Shakti

次のように外部キーのオプションを渡すことができます。

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

一意の制約を追加したい場合、これはインデックスオプションにも当てはまります。

t.references :post, foreign_key: { to_table: :my_posts }, index: { unique: true}

ちなみに、参照はbelongs_toのエイリアスです。正確には、belongs_toは参照のエイリアスです。

実装の詳細を見る Rails 5.0.rc2Rails 4.2

31
Stefan Staub

次のようになります。

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 

ドキュメントを見てください: http://apidock.com/Rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_foreign_key

列の名前が異なる場合は、columnオプションを使用します。

14
lunr