【问题标题】:Unexpected results using has_one association for lookup使用 has_one 关联进行查找的意外结果
【发布时间】:2013-11-04 05:04:10
【问题描述】:

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

感谢任何帮助。

:)

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      更新

      company has_many_and_belongs_to location 将是更好的关系选择,因为一个公司可以有很多地点,而一个地点可以有很多公司。

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

      【讨论】:

      • A公司、B公司和C公司的总部都可以在同一个城市,所以链接很好。
      • 是的,我就是这么说的 :)
      • 等一下,您是说belongs_to 应该在公司或位置,以便链接起作用?
      • 位置属于公司。更恰当的关系是公司 has_many_and_belongs_to 位置。一个公司可以有很多地方,一个地方可以有很多公司。这更像是一种多对多的关系,仅仅将这两者与一对一的关系(belongs_to)联系起来是不够的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多