【问题标题】:Rails one-to-one works for belongs_to but not for has_oneRails 一对一适用于 belongs_to 但不适用于 has_one
【发布时间】:2018-01-21 18:53:42
【问题描述】:

我有 2 个表 scenariosrental_details

关系是:

  • rental_details属于场景
  • 场景 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=

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

如果我有这样的一对一关系,我不能从场景对象访问rental_details 表吗?我以为外键在“belongs_to”表中,我可以自动从“has_one”表的对象中调用它的内容。

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

【问题讨论】:

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


    【解决方案1】:

    这是约定:

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

    class Scenario < ActiveRecord::Base
     has_one :rental_detail
    end
    

    Scenario has_many RentalDetail =>scenario_1.rental_details.pluck(:id) (has_many docs)。它使用复数版本的 RentalDetail。

    class Scenario < ActiveRecord::Base
     has_many :rental_details
    end
    

    正如我所说,这是惯例,但没有人阻止您随意命名关联。您只需要告诉 ActiveRecord 使用正确的class_nameprimary_keyforeign_key 等。查看文档。

    【讨论】:

    • 我检查了文档,但这里的问题是我使用了正确的约定(即这种一对一关系的所有内容都是单数),但是,我仍然无法访问rental_detail来自我创建的场景对象的数据。
    • 您必须将您的关联命名为“singular”,rental_detail。我必须工作。那就是约定。 scenario_1.rental_detail.id - 在rental_detail 末尾没有s
    • 这里是我目前使用的模型和关联:class Scenario
    • 我重新运行了所有内容,现在可以正常工作了。我可以确认,一旦所有都是单数,它就可以工作。
    【解决方案2】:

    这是预期的行为。

    您仍在访问正确的对象——RentalDetail 对象。如果 Scenario has_many RentalDetail,那么将使用复数形式访问它。

    【讨论】:

    • 感谢您的回复。如果这是预期的行为,我如何获取场景对象的 rent_details id?
    猜你喜欢
    • 2016-10-10
    • 2014-02-26
    • 1970-01-01
    • 2017-02-25
    • 2016-06-18
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多