Rails一对一适用于belongs_to但不适用于has_one

时间:2018-01-21 18:53:42

标签: ruby-on-rails one-to-one

我有2个表情景 rental_details

关系是:

  • rental_details belongs_to 情景
  • 广告 has_one rental_detail

在rental_details表中,我将scenario_id作为列(注意这是数据类型INTEGER而不是FOREIGN_KEY)。

如果我在rails控制台中运行以下命令:

rental_details_1 = RentalDetail.find(123)
rental_details_1.id
=> 123
rental_details.scenario.id
=> 22 #i.e. this is linked to scenario with id = 22

但是,如果我执行以下操作:

scenario_1 = Scenario.find(22)
scenario_1.id
=> 22
scenario_1.rental_details.id

我收到以下错误:

  

NoMethodError:

的未定义方法`rental_details'      

     你的意思是? rental_detail                  rental_detail =

如果我将其更改为scenario_1.rental_details.id,我仍会收到错误。

如果我有这样的一对一关系,我是否可以从方案对象中访问rental_details表?我认为外键位于“belongs_to”表中,我可以自动从“has_one”表的对象中调用其内容。

(抱歉,我是编码的新手,所以我的术语很可能是错误的。)

2 个答案:

答案 0 :(得分:0)

这是预期的行为。

您仍在访问正确的对象 - RentalDetail对象。如果场景has_many RentalDetail,则可以使用复数形式访问它。

答案 1 :(得分:0)

这是惯例:

Scenario has_one RentalDetail => scenario_1.rental_detail.id(has_one docs)。它使用RentalDetail的单数形式。

class Scenario < ActiveRecord::Base
 has_one :rental_detail
end

Scenario has_many RentalDetail =&gt; scenario_1.rental_detail s .pluck(:id)(has_many docs)。它使用RentalDetail的复数版本。

class Scenario < ActiveRecord::Base
 has_many :rental_details
end

正如我所说,这是对话,但没有人阻止你按照自己的意愿命名关联。您只需要告诉ActiveRecord使用正确的class_nameprimary_keyforeign_key等。检查文档。