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个模型连接起来,以便于访问。除了捷径之外,还有什么我想念的吗?
答案 0 :(得分:49)
逻辑,好吧这可能听起来有点弱但是说“我有一个供应商谁有我的帐户,我想看到整个该供应商的帐户历史记录“,因此我可以直接从供应商处访问帐户历史记录。
效率,这对我来说是我使用:through
的主要原因,只是因为这会发出一个连接语句,而不是调用supplier,然后是account,然后是account_history 。注意到数据库调用的数量?
使用:through
,1次致电获取供应商,1次致电获取account_history(rails自动使用:join
通过帐户检索)
使用普通关联,1次呼叫获取供应商,1次呼叫获取帐户,1次呼叫获取account_history
这就是我的想法=)希望它有所帮助!
答案 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 => :membership
但class Group has_many :members, :through => memberships
。中间模型membership
对于跟踪反向关系很有用。
可扩展性:has_one :through
关系可以轻松扩展并扩展为has_many :through
关系