如何正确地使rails覆盖belongs_to关联中的foreign_key命名?

时间:2015-05-22 11:23:58

标签: ruby-on-rails foreign-keys associations legacy-database

我确信这是一个非常基本的问题,我看过相关问题,但我仍感到困惑。我对RoR缺乏经验 - 请原谅我的无知!

我已经在遗留数据库上使用scaffolding设置了mvc类(通过schema_to_scaffold)。当我打开schema.rb时,我可以看到主键已经使用非默认名称正确识别,例如:

 create_table "my_ncs", primary_key: "ID_NC", force: true do |m| 

   # etc...

 end

 create_table "my_revisions", primary_key: "ID_REVISION", force: true do |m|
   m.decimal "ID_NC", precision: 10, scale:0, null: false 

   # etc ...

 end

一个"my_nc"与关联的"my_revisions"之间存在一对多的关系。 (令我困惑的第一件事是相应的模型文件MyNcMyRevision没有显示我的预期:self.primary_key='ID_NC'self.primary_key='ID_REVISION',但没关系)

现在我尝试设置此关联和嵌套路由,以便能够像/my_ncs/6/my_revisions这样的网址为my_revisions提供my_nc ID_NC=6 {1}}。

这就是我尝试这样做的方式:

class MyNc < ActiveRecord::Base
  has_many :MyRevisions
end

class MyRevision < ActiveRecord::Base
  belongs_to :MyNc, foreign_key: 'ID_NC'
end 

现在我正在尝试使用rails console来测试这个,而这是我完全糊涂的时候

irb(main):001:0> n = MyNc.find(6)
  MyNc Load (0.0ms)  SELECT  `my_ncs`.* FROM `my_ncs`  WHERE `my_ncs`.`ID_NC` = 6 LIMIT 1
=> #<MyNc ID_NC: 6, etc...>

irb(main):002:0> n.MyRevisions
  MyRevision Load (22.0ms)  SELECT `my_revisions`.* FROM `my_revisions`  WHERE `my_revisions`.`my_nc_
id` = 6
Mysql2::Error: Unknown column 'my_revisions.my_nc_id' in 'where clause': SELECT `my_revisions`.* FROM `my
_revisions`  WHERE `my_revisions`.`my_nc_id` = 6

使用foreign_key的默认名称my_nc_id,而不是ID_NC

我做错了什么?

许多人提前感谢!

1 个答案:

答案 0 :(得分:2)

您还应在foreign_key关联中指定has_many

class MyNc < ActiveRecord::Base
  has_many :my_revisions, foreign_key: 'ID_NC'
end
class MyRevision < ActiveRecord::Base
  belongs_to :my_nc, foreign_key: 'ID_NC'
end

请注意,我更改了您的关联名称,使其遵循Ruby约定。