Rails 一对一适用于 belongs_to 但不适用于 has_one
Rails one-to-one works for belongs_to but not for has_one
我有 2 tables 场景 和 rental_details。
关系是:
- rental_detailsbelongs_to场景
- 场景has_onerental_detail
在 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_name
、primary_key
、foreign_key
等。检查文档。
我有 2 tables 场景 和 rental_details。
关系是:
- rental_detailsbelongs_to场景
- 场景has_onerental_detail
在 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_name
、primary_key
、foreign_key
等。检查文档。