Ruby on rails 为什么ActiveRecord会在我的新表上生成不需要的外键约束?

Ruby on rails 为什么ActiveRecord会在我的新表上生成不需要的外键约束?,ruby-on-rails,ruby,postgresql,activerecord,rails-migrations,Ruby On Rails,Ruby,Postgresql,Activerecord,Rails Migrations,我试图在ActiveRecord中创建一个多态模型。它应该与任何类型的另一个对象具有一对一的关系。我正在关注LaunchSchool的博客文章 我的迁移: # Expresses an explanation for an action or event class CreateReasons < ActiveRecord::Migration def change create_table :reasons do |t| t.string :description

我试图在ActiveRecord中创建一个多态模型。它应该与任何类型的另一个对象具有一对一的关系。我正在关注LaunchSchool的博客文章

我的迁移:

# 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
如果删除此行,则会发生相同的错误

当我运行
rake db:migrate
(带或不带
bundle exec
)时,我得到一个错误,我想是因为外键约束:

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

我不知道这个约束是从哪里来的,我想我不需要它,因为这个关系应该是多态的(
事件
关系可以是任何类型)。为什么在那里?我做错了什么?

《Rails指南》以不同的方式编写迁移文档

class-CreateReasons

我使用了您在问题中提到的方法来处理早期版本的rails

您的迁移似乎还可以,我很难想象由
ActiveRecord
本身提供的这种行为。除此之外,
Rails
自动生成的外键可能会被命名为
index\u reasons\u on\u event\u id
,而不是
fk\u reasons\u event\u id

在我看来,这里有一些事情是在幕后进行的,就像前面描述的那样,比如修补
ActiveRecord::ConnectionsAdapters


我建议检查初始值设定项文件是否存在一些令人讨厌的monkeypatching,可能检查您的Gemfile是否存在类似于
自动\u外键
模式加
,它可以根据列名和关系自动推断外键。

FYI:我做了大量的挖掘工作,并确信没有神奇的隐式/自动添加fk约束。我想可能有一个命名惯例,但我没有发现任何类似的事情。查看指向的链接--与隐式fk无关。还有,它也没有关于隐式fk的内容。所以我很确定那不是它。@alexanderbird+1。AR似乎推断出事件_id是一个引用,并神奇地添加了外键约束。我不知道这是否是爆炸的惯例之一。(事件是单数的)它看起来确实是在推断它,但从文档中我看不到任何迹象表明它是这样做的。如果在4.2之前有任何这样的魔法,那么就没有必要使用,然后是后来的。从那时起,我就没有读过所有的变更日志,但至少5.0.0变更日志中没有添加这样的魔力,我的谷歌搜索也没有显示任何东西。我还在rails 4.2.5上用mysql2进行了试用,没有fk AddedHanks
schema\u plus
(或者更具体地说,它包括的
schema\u auto\u foreign\u keys
)是我的罪魁祸首。我在迁移中添加了
外键:false
,效果非常好。
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
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