使用has_one关联进行查找的意外结果

时间:2013-11-04 05:04:11

标签: ruby-on-rails activerecord associations has-one

我在公司实体上有一个位置的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)。我有其他查找以相同的方式定义,它们的行为与我期望的一样。

有几点需要注意:

  • 一个位置不属于公司,许多实体类型都可以拥有 位置
  • 我尝试在我的关联定义中更多/更少详细, 好像没什么区别
  • 我也曾尝试'has_one:location'来保持简单, 相同的结果

感谢任何帮助。

:)

2 个答案:

答案 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)中添加一个额外的列来标识公司的总部。