Rails has_one:通过关联

时间:2010-01-22 08:46:26

标签: ruby-on-rails associations rails-activerecord rails-models

Rails有一个has_one :through关联,通过第二个模型帮助建立与第三个模型的一对一关联。除了建立一个快捷方式关联之外,它的实际用途是什么,否则这将是一个额外的步骤。

从Rails guide获取此示例:

class Supplier < ActiveRecord::Base
  has_one :account
  has_one :account_history, :through => :account
end

class Account < ActiveRecord::Base
  belongs_to :supplier
  has_one :account_history
end

class AccountHistory < ActiveRecord::Base
  belongs_to :account
end

可能允许我们做类似的事情:

supplier.account_history

否则将达到:

supplier.account.history

如果只是为了更简单的访问,那么从技术上讲,可能存在一对一的关联,它将模型与通过n-1模型的某个第n个模型连接起来,以便于访问。除了捷径之外,还有什么我想念的吗?

3 个答案:

答案 0 :(得分:49)

  1. 逻辑,好吧这可能听起来有点弱但是说“我有一个供应商谁有我的帐户,我想看到整个该供应商的帐户历史记录“,因此我可以直接从供应商处访问帐户历史记录。

  2. 效率,这对我来说是我使用:through的主要原因,只是因为这会发出一个连接语句,而不是调用supplier,然后是account,然后是account_history 。注意到数据库调用的数量?

    • 使用:through,1次致电获取供应商,1次致电获取account_history(rails自动使用:join通过帐户检索)

    • 使用普通关联,1次呼叫获取供应商,1次呼叫获取帐户,1次呼叫获取account_history

  3. 这就是我的想法=)希望它有所帮助!

答案 1 :(得分:10)

我很惊讶没有人触及关联对象

has_many(或has_one:through关系有助于使用 association object pattern ,当你有两件事与每件相关时其他,并且该关系本身具有属性(即关联成立或何时到期的日期)。

这是considered by some,是has_and_belongs_to_many ActiveRecord帮助器的一个很好的替代品。这背后的原因是,您很可能需要更改关联的性质或添加关联,并且当您进入项目的几个月时,如果关系最初设置为关联,这可能会非常痛苦a has_and_belongs_to_many(第二个链接详细介绍)。如果最初使用has_many :through关系进行设置,那么在项目进行几个月后,可以轻松地重命名连接模型或向其添加属性,从而使开发人员更容易响应不断变化的需求。计划变革。

答案 2 :(得分:8)

  • 反向关联:考虑经典情况user-membership -group。如果用户可以是许多组中的成员,则组具有许多成员或用户,并且用户具有许多组。但是,如果用户只能是一个组中的成员,则该组仍有许多成员:class User has_one :group, :through => :membershipclass Group has_many :members, :through => memberships。中间模型membership对于跟踪反向关系很有用。

  • 可扩展性has_one :through关系可以轻松扩展并扩展为has_many :through关系