Rails has_one: through association

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模型更容易访问的某个 nth 模型连接起来。除了这条捷径之外,还有什么我不知道的吗?

60849 次浏览
  1. 逻辑 ,好吧,这听起来可能有点弱,但是说“我有一个与我有帐户的供应商,我想看到这个供应商的整个帐户历史”是合乎逻辑的,所以对我来说,能够直接从供应商那里获取帐户历史是有意义的。

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

    • 使用 :through,1调用获取供应商,1调用获取 Account _ history (Rails 自动使用 :join获取通过帐户)

    • 使用正常关联,1个电话获取供应商,1个电话获取帐户,1个电话获取帐户历史

我就是这么想的,希望能有所帮助!

  • 反向关联 : 考虑典型情况下的用户-成员组。如果一个用户可以是许多组中的成员,那么一个组有许多成员或用户,而一个用户有许多组。但是如果用户只能是一个组中的成员,那么该组仍然有许多成员: class User has_one :group, :through => :membership但是 class Group has_many :members, :through => memberships。中间模型 membership有助于跟踪反向关系。

  • 可扩展性 : 一个 has_one :through关系可以很容易地扩展到一个 has_many :through关系

我很惊讶竟然没人提到 关联对象

has_many(或 has_one) :through关系有助于使用 关联对象模式,即当你有两个相互关联的事物时,这种关系本身具有属性(即关联形成或失效的日期)。

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