1. ホーム
  2. ruby-on-rails

[解決済み] Railsの移行: テーブルへのadd_referenceが、外部キーのカラム名がRailsの規則と異なる場合

2023-08-02 10:01:34

質問

以下の2つのモデルを持っています。

class Store < ActiveRecord::Base
    belongs_to :person
end

class Person < ActiveRecord::Base
    has_one :store
end

以下は問題点です。Peopleテーブル内に外部キーを作成するためのマイグレーションを作成しようとしています。しかし、Store の外部キーを参照するカラムの名前が store_id という名前がついておらず、代わりに foo_bar_store_id .

もし私がrailsの規約に従っているならば、このようにマイグレーションを行うでしょう。

class AddReferencesToPeople < ActiveRecord::Migration
  def change
    add_reference :people, :store, index: true
  end
end

しかし、これは動作しません。なぜなら、カラム名が store_id となっていますが、これは foo_bar_store_id . では、高速なパフォーマンスを維持するために、外部キー名が異なるだけで、index: trueを維持するように指定するにはどうすればよいでしょうか?

どのように解決するのですか?

EDIT: 刻み目を見、読み続けない人のために!

この回答は、型破りな外部キーカラム名を持つという目標を達成する一方で、インデックスを使用すると データベースに fk 制約を追加するわけではありません。 . を使用したより適切な解決策については、他の回答を参照してください。 add_foreign_key や'add_reference'を使ったより適切な解決策を参照してください。

注意: 他の答えも常に見てください。

オリジナルの回答です。

あなたの AddReferencesToPeople マイグレーションで、フィールドとインデックスを手動で追加することができます。

add_column :people, :foo_bar_store_id, :integer
add_index :people, :foo_bar_store_id

そして、モデルにはこのように外部キーを知らせます。

class Person < ActiveRecord::Base
  has_one :store, foreign_key: 'foo_bar_store_id'
end