6

我正在使用 Rails 4 和 SQLite。我正在尝试将外键添加到我的indicators表中。请在下面查看我的代码

class Indicator < ActiveRecord::Base
  belongs_to :objetive
  belongs_to :responsible, class_name: "Person"

end

迁移脚本:

class AddFksToIndicator < ActiveRecord::Migration
  def change
      add_reference :indicators, :objective, index: true
      add_reference :indicators, :responsible, index: true
  end
end

运行迁移时一切正常,所以我在控制台中尝试:

2.0.0p247 :002 > i = Indicator.new
 => #<Indicator id: nil, name: nil, created_at: nil, updated_at: nil, objective_id: nil, responsible_id: nil> 
2.0.0p247 :002 > i.objective_id = 0
2.0.0p247 :003 > i.save

令我惊讶的是,该指标已保存,并且没有obectiveid = 0。

最后,我检查了指标表架构,我得到:

CREATE TABLE "indicators" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "created_at" datetime, "updated_at" datetime, "objective_id" integer, "responsible_id" integer);
CREATE INDEX "index_indicators_on_objective_id" ON "indicators" ("objective_id");
CREATE INDEX "index_indicators_on_responsible_id" ON "indicators" ("responsible_id");

objective_id为什么和上没有外键约束responsible_id?难道我做错了什么?

4

2 回答 2

9

根据Ruby on Rails 4.2 Release notes,只有 mysql、mysql2 和 postgresql 适配器支持外键。

不幸的是,sqlite3 适配器没有。

于 2015-03-02T01:39:11.103 回答
0

当您使用add_reference时,您需要添加foreign_key: trueto 以获得该调用的外键支持。例如:

add_reference :indicators, :objective, index: true, foreign_key: true

默认值为,如此foreign_key: false的文档中所述。

由于您已经创建了没有外键的迁移,因此您需要创建另一个迁移并调用add_foreign_key.

例如:

def change
   # add_foreign_key(from_table, to_table)
   add_foreign_key :indicators, :objectives
end

add_foreign_key.

希望这可以帮助。

于 2015-05-26T03:57:12.827 回答