2

私はActiveRecordで多型モデルを作ろうとしています。任意のタイプの別のオブジェクトと1対1の関係を持つ必要があります。私はUnderstanding Polymorphic Associations in Rails LaunchSchoolのブログ記事に従っています。なぜ、ActiveRecordは新しいテーブルで不要な外部キー制約を作成しますか?

私の移行:私はadd_foreign_keyを呼び出すない午前

# Expresses an explanation for an action or event 
class CreateReasons < ActiveRecord::Migration 
    def change 
    create_table :reasons do |t| 
     t.string :description 
     t.integer :event_id 
     t.string :event_type 

     t.timestamps 
    end 
    end 
end 

注意。

私のモデルクラス:

# Expresses an explanation for an action or event 
class Reason < ActiveRecord::Base 
    belongs_to :event, polymorphic: true 
end 

私はこの行を削除した場合、同じエラーが発生します。この制約がどこから来た

D, [2016-04-05T22:40:41.389615 #45464] DEBUG -- : (9.7ms) CREATE TABLE "reasons" ("id" serial primary key, "description" character varying(255), "event_id" integer, "event_type" character varying(255), "created_at" timestamp, "updated_at" timestamp, CONSTRAINT fk_reasons_event_id FOREIGN KEY ("event_id") REFERENCES "events" ("id")) 
E, [2016-04-05T22:40:41.390720 #45464] ERROR -- : PG::Error: ERROR: relation "events" does not exist 
: CREATE TABLE "reasons" ("id" serial primary key, "description" character varying(255), "event_id" integer, "event_type" character varying(255), "created_at" timestamp, "updated_at" timestamp, CONSTRAINT fk_reasons_event_id FOREIGN KEY ("event_id") REFERENCES "events" ("id")) 
D, [2016-04-05T22:40:41.391245 #45464] DEBUG -- : (0.2ms) ROLLBACK 

は、私にはわからない、と私ドン:私は(またはbundle execなし)rake db:migrateを実行すると

、私はエラーを取得し、私があるため、外部キー制約を考えますこの関係は多型でなければならないと思う(eventの関係はどのタイプでもよい)。それはなぜそこにあるのですか?私は何を間違えたのですか?

+1

あなたはRails 5にいますか? – spickermann

+1

FYI:私はたくさんの掘り出しを行い、fk制約の暗黙的/自動的な追加がないと確信しています。私は命名規則が続いているかもしれないと思ったが、私はそのようなものは見つけていない。 https://robith.rakuten.co.jp/references-integrity-with-foreign-keys https://github.com/rails/rails/pull/15606にリンクしています。暗黙的なfkについては何もありません。また、[rails 5 activerecord changelog](https://github.com/rails/rails/blob/v5.0.0.beta1/activerecord/CHANGELOG.md)には暗黙的なfkについては何もありません。だから私はそれが本当ではないと確信しています。 – alexanderbird

+0

@alexanderbird +1。 ARはevent_idを参照と推測し、魔法のように外部キー制約を追加しているようです。私はそのコンベンションのものが爆発するのだろうかと思います。 (イベントは単数である) – Shishir

答えて

1

あなたの移行は大丈夫です。ActiveRecordによって提供されるこの種の動作はほとんど想像できません。それ以上の場合、Railsによって自動的に生成された外部キーは、おそらくindex_reasons_on_event_idという名前になりますが、fk_reasons_event_idではなくなります。

hereのように、ActiveRecord::ConnectionsAdaptersにパッチを当てるのと同じように、ここで何かが起こっていると思います。

初期化ファイルでいくつかの厄介なMonkeypatchと、おそらくGemfileをautomatic_foreign_keyまたはschema_plusのようにチェックして、列名とリレーションから外部キーを自動的に推測することをお勧めします。

+0

ありがとう!私の場合、 'schema_plus'(またはそれに含まれる' schema_auto_foreign_keys')が原因でした。マイ・マイグレーションに 'foreign_key:false'を追加しました。 –

1

レールガイドは、さまざまな移行方法をドキュメント化しています。 SEE

class CreateReasons < ActiveRecord::Migration 
    def change 
    create_table :reasons do |t| 
     t.string :description 
     t.references :event, polymorphic: true, index: true 
     t.timestamps 
    end 
    end 
end 

私はレールの以前のバージョンのためにあなたの質問に記載された方法を使用しています。

関連する問題