我在公司实体上有一个位置的has_one关联:
class Location < ActiveRecord::Base
attr_accessible :city, :country, :postal_code, :state
end
class Company < ActiveRecord::Base
has_one :headquarters, :class_name => "Location"
end
公司实体的基础架构包含location_id属性。我希望我能够访问公司的总部位置信息,如下所示:
Company.find(12345).headquarters
然而,这会导致异常:
SELECT "locations".* FROM "locations" WHERE "locations"."company_id" = 12345 LIMIT 1
ActiveRecord::StatementInvalid: PGError: ERROR: column locations.company_id does not exist
我很困惑为什么这样做。我希望FK在公司而不是位置(即SELECT * FROM location WHERE locations.id = 12345)。我有其他查找以相同的方式定义,它们的行为与我期望的一样。
有几点需要注意:
感谢任何帮助。
:)
答案 0 :(得分:0)
听起来你应该使用belongs_to而不是has_one。具体地,
class Company < ActiveRecord::Base
belongs_to :headquarters, :class_name => "Location", :foreign_key => "location_id"
end
因为您说外键是在公司而不是位置。
答案 1 :(得分:0)
当你说公司有一个位置时,你暗示它是位于Locations表中的FK。 has_one
关系是一对一的关系,在您的情况下,将company_id
添加到Locations
表格是完全合理的。
belongs_to
关系(即位置belongs_to公司)在这里没有意义,因为这样可以将多家公司链接到一个位置。当然,除非您想允许这种情况,否则会失去has_one
模型上的Company
关系,并在belongs_to
模型上添加Location
关系。
<强>更新强>
鉴于公司可以拥有多个地点而一个地点可以拥有多家公司, company has_many_and_belongs_to location
将是更好的关系选择。
我只需在位置表(is_headquarter)中添加一个额外的列来标识公司的总部。