Rails has_one:through association

问题描述 投票:66回答:3

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个模型连接起来,以便于访问。除了快捷方式之外,我还有什么想念的吗?

ruby-on-rails associations rails-activerecord rails-models
3个回答
53
投票
  1. Logic,好吧,这听起来可能有些微弱,但可以这样说:“我有一个与我有帐户的供应商,我想查看该供应商的整个帐户历史记录“,因此对我而言,能够直接从供应商访问帐户历史记录是有意义的。

  2. Efficiency,这对我来说是我要使用:through的主要原因,原因仅在于此命令发出的是join语句,而不是先调用供应商,然后是account,然后是account_history。注意到数据库调用数量了?

    • 使用:through,调用1来获取供应商,调用1来获取account_history(rails自动使用:join来通过帐户进行检索)

    • 使用普通关联,1个致电获取供应商,1个致电获取帐户,1个致电获取account_history

这就是我的想法=)希望对您有所帮助!


10
投票

令我惊讶的是,没有人触及Association Objects


9
投票
  • Inverse association

© www.soinside.com 2019 - 2024. All rights reserved.