Railsでmigration
を作成し、別のテーブルを参照します。通常、私は次のようなことをします:
add_column :post, :user, :references
これにより、posts
テーブルにuser_id
という名前の列が作成されます。しかし、user_id
の代わりにauthor_id
のようなものが必要な場合はどうでしょうか。どうやってやるの?
手動で行う:
add_column :post, :author_id, :integer
ただし、belongs_toステートメントを作成するときは、変更する必要があるため、ここで呼び出す必要があります
def post
belongs_to :user, :foreign_key => 'author_id'
end
Rails 4.2 +では、 外部キー もデータベースに設定できます これは素晴らしいアイデアです 。
単純な関連付けの場合、これはt.references
追加foreign_key: true
でも実行できますが、この場合は2行が必要です。
# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id
# The model
belongs_to :author, class_name: "User"
Post
モデルテーブルを定義する場合、references
、index
、およびforeign_key
を1行で設定できます。
t.references :author, index: true, foreign_key: { to_table: :users }
既存のテーブルに参照を追加する場合、これを行うことができます。
add_reference :posts, :author, foreign_key: { to_table: :users }
注:index
のデフォルト値はtrueです。
Rails 4では、postgresqlと schema_plus gemを使用する場合、次のように書くことができます。
add_reference :posts, :author, references: :users
これにより、列author_id
が作成され、users(id)
を正しく参照します。
そして、あなたのモデルでは、あなたは書く
belongs_to :author, class_name: "User"
新しいテーブルを作成するときは、次のように記述できます。
create_table :things do |t|
t.belongs_to :author, references: :users
end
注:
schema_plus
gem全体はRails 5+と互換性がありませんが、この機能はgem schema_auto_foreign_keys (schema_plusの一部)によって提供されますRailsで5。
外部キーを使用していない場合、他のテーブルの実際のテーブル名は関係ありません。
add_reference :posts, :author
Rails 5の時点で、外部キーを使用している場合は、外部の別のテーブルの名前を指定できますキーオプション。 (議論については https://github.com/Rails/rails/issues/2156 を参照)
add_reference :posts, :author, foreign_key: {to_table: :users}
Rails 5の前に、外部キーを別のステップとして追加する必要があります。
add_foreign_key :posts, :users, column: :author_id