web-dev-qa-db-ja.com

「参照」移行で列名を指定する

Railsでmigrationを作成し、別のテーブルを参照します。通常、私は次のようなことをします:

add_column :post, :user, :references

これにより、postsテーブルにuser_idという名前の列が作成されます。しかし、user_idの代わりにauthor_idのようなものが必要な場合はどうでしょうか。どうやってやるの?

111
caarlos0

手動で行う:

add_column :post, :author_id, :integer

ただし、belongs_toステートメントを作成するときは、変更する必要があるため、ここで呼び出す必要があります

def post
    belongs_to :user, :foreign_key => 'author_id'
end
53
mschultz

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"
239
ecoologic

Rails 5+の場合

初期定義:

Postモデルテーブルを定義する場合、referencesindex、およびforeign_keyを1行で設定できます。

t.references :author, index: true, foreign_key: { to_table: :users }

既存の更新:

既存のテーブルに参照を追加する場合、これを行うことができます。

add_reference :posts, :author, foreign_key: { to_table: :users }

注:indexのデフォルト値はtrueです。

201
Sheharyar

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。

83
nathanvda

外部キーを使用していない場合、他のテーブルの実際のテーブル名は関係ありません。

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
48
jes5199