71

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

以 Rails指南中的示例为例:

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 个模型连接起来,以便于访问。除了快捷方式之外,我还缺少其他什么吗?

4

3 回答 3

59
  1. 逻辑,好吧,这听起来可能有点弱,但说“我有一个与我有账户的供应商,我想查看该供应商的整个账户历史”是合乎逻辑的,所以这对我来说很有意义能够直接从供应商处访问帐户历史记录。

  2. 效率,这对我来说是我会使用的主要原因:through,仅仅是因为这会发出一个加入声明而不是调用供应商,然后是帐户,然后是 account_history。注意到数据库调用的次数了吗?

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

    • 使用正常关联,1 次调用获取供应商,1 次调用获取帐户,1 次调用获取 account_history

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

于 2010-01-22T09:10:27.180 回答
14

我很惊讶没有人触及Association Objects

has_manyhas_one:through关系有助于关联对象模式的使用,即当您有两个相互关联的事物时,并且该关系本身具有属性(即建立关联的日期或关联到期的日期)。

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

于 2014-09-09T19:10:16.613 回答
12
  • 逆关联:考虑经典情况用户-成员-组。如果一个用户可以是多个组的成员,那么一个组有很多成员或用户,而一个用户有很多组。但是如果用户只能是一个组的成员,该组仍然有很多成员:class User has_one :group, :through => :membership但是class Group has_many :members, :through => memberships. 中间模型membership对于跟踪反向关系很有用。

  • 可扩展性:has_one :through关系可以很容易地扩展和扩展为has_many :through关系

于 2013-04-02T13:07:02.303 回答