Rails has_one:通过关联

Rails has_one :through关联,通过第二个模型帮助build立与第三个模型的一对一关联。 除了build立一个捷径关联之外,真正的用处是什么呢,否则这将是一个额外的步骤。

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

  1. 逻辑 ,好吧,这可能听起来有点弱,但说“我有一个供应商有我的帐户,我想看到这个供应商的整个帐户历史”是合乎逻辑的,所以这对我来说是有道理的以便能够直接从供应商访问帐户历史logging。

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

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

    • 使用正常关联,1个电话获得供应商,1个电话获得账户,1个电话获得account_history

这就是我认为=)希望它有帮助!

  • 反向关联 :考虑经典情况user-membership-group。 如果一个用户可以成为多个组的成员,那么一个组有很多成员或用户,而一个用户有许多组。 但是,如果用户只能是一个组中的成员,那么该组仍然有许多成员: 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关系有助于使用关联对象模式 ,即当您有两件事情彼此相关时,该关系本身具有属性(即关联的生成date或过期时间)。

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