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个模型连接以便于访问。 除了快捷方式以外,还有其他什么吗?
-
逻辑 ,好吧,这可能听起来有点弱,但说“我有一个供应商有我的帐户,我想看到这个供应商的整个帐户历史”是合乎逻辑的,所以这对我来说是有道理的以便能够直接从供应商访问帐户历史logging。
-
效率 ,这对我来说是我使用的主要原因
: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
关系进行设置,那么在项目几个月之后,可以轻松地重命名连接模型或向其添加属性,从而使开发人员更容易响应不断变化的需求。 计划改变。