外部キーを追加して別のテーブル名を割り当てるにはどうすればよいですか。例えば
私のようなモデルがあります
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
しかし、それは機能していません。移行をキャンセルしています。モデル構造で動作するように移行ファイルを変更するにはどうすればよいですか。
次のように外部キーのオプションを渡すことができます。
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.rc2 & Rails 4.2
次のようになります。
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
オプションを使用します。