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

Rails one-to-one works for belongs_to but not for has_one

我有 2 tables 场景rental_details

关系是:

在 rental_details table 中,我将 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: undefined method `rental_details' for

Did you mean? rental_detail rental_detail=

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

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

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

这是预期的行为。

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

这是惯例:

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 => scenario_1.rental_details.pluck(:id) (has_many docs)。它使用 RentalDetail 的复数形式。

class Scenario < ActiveRecord::Base
 has_many :rental_details
end

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