0

我对公司实体的某个位置有一个 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' 以保持简单,结果相同

任何帮助表示赞赏。

:)

4

2 回答 2

0

当您说 Company has_one location 时,您暗示它取决于 Locations 表来拥有 FK。has_one关系是一对一的关系,在您的情况下,将 a 添加到company_idLocations中非常有意义。

关系(即 Location belongs_to Company)在belongs_to这里没有意义,因为这将允许您将多个公司链接到一个位置。当然,除非您希望允许这样做,否则请丢失模型上的关系并改为在模型has_oneCompany添加belongs_to关系。Location

更新

company has_many_and_belongs_to location考虑到一家公司可以有很多地方,而一个地方可以有很多公司,这将是一个更好的关系选择。

我只需在位置表 (is_headquarter) 中添加一个额外的列来标识公司的总部。

于 2013-11-04T05:31:40.800 回答
0

听起来您应该使用belongs_to 而不是has_one。具体来说,

class Company < ActiveRecord::Base
  belongs_to :headquarters, :class_name => "Location", :foreign_key => "location_id"
end

因为你说外键在公司而不是位置。

于 2013-11-04T05:24:46.163 回答