Rails has_one:通过关联

问题描述:

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

以从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 

如果它是只是为了更简单的访问,那么技术上可能存在一对一关联t将模型与通过n-1模型的第n个模型连接起来,以便于访问。除了快捷方式之外,我还有什么其他的东西吗?

  1. 逻辑,确定这听起来有点弱了这一点,但它是合乎逻辑地说,“我有谁与我的帐户供应商,我想看到的这个整个帐户历史记录供应商“,因此我可以直接从供应商那里获取帐户历史记录。

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

    • 使用:through,1个调用来获取供应商,1个来电,让account_history(自动导轨采​​用:join通过帐户检索),使用正常的关联

    • ,1个来电,让供应商,1个来电,获得账号和1个来电,让account_history

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

+2

我认为逻辑参数非常有效。听起来更自然一些,把我的这个供应商的账户记录给我,而不是供应商的账户历史记录。考虑到Ruby/Rails哲学中流动的句子而不是代码,它非常微妙,但仍然更容易记住。我知道我们可以看到正在发布的实际DB查询,但Rails是否指定这些方法调用将如何转换为SQL? – Anurag 2010-01-22 09:44:31

+10

这也避免了违反德米特法。 – 2011-02-16 00:22:19

+2

@TomCrayford,我真的不知道它是如何做到的。这不会使这种关系变得不那么直接吗? – 2012-05-20 08:42:20

  • 呈负相关:考虑到经典的形势用户会员组。如果用户可以成为多个组的成员,那么一个组有许多成员或用户,并且用户有很多组。但是,如果用户只能成为一个组的成员,该组仍然有许多成员: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关系有利于使用的association object pattern这是当你有彼此相关的两件事情,而这种关系本身有关联时作出的属性(如日期或时到期)。

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