嵌套has_many:通过rails 3

时间:2011-01-18 04:29:40

标签: ruby-on-rails ruby-on-rails-3 models rails-models

我知道Rails不支持嵌套的has_many:通过关系,虽然早在Rails 2之前就已有关于补丁的谈话和开放票证。

我确实来了across a plugin这很漂亮,但是主分支不能与Rails 3一起工作,我对于在应用程序中使用它来完成任务关键任务犹豫不决,因此缺乏活跃的近期开发。那么 - 处理这些关系的最佳方式是什么。

class Author < ActiveRecord::Base
  has_many :contracts
  has_many :products, :through => :contracts

class Product < ActiveRecord::Base
  has_many :contracts
  has_many :orders
  has_many :authors, :through => :contracts

class Contracts < ActiveRecord::Base
  belongs_to :author
  belongs_to :product

所以,通过将此添加到作者模型,能够获得订单将会很棒:

has_many :orders, :through => :products

但是,唉,你不能 - 至少没有插件。所以,我的问题是,当唯一的关联是在连接模型,合同之间时,访问所有作者订单的最佳方法是什么?

3 个答案:

答案 0 :(得分:8)

如果您没有尝试通过嵌套关联创建对象,并且您只想将它​​用于查找,那么Rails 3中的范围是一种很好的方法。或者,您可以实现类方法。

我在最近教过的一个课程中有这样的事情,Rails 3版本的代码在这里: https://github.com/wolframarnold/Efficient-TDD-Rails3/blob/master/app/models/user.rb

请参阅items方法的定义。规格在这里: https://github.com/wolframarnold/Efficient-TDD-Rails3/blob/master/spec/models/user_orders_spec.rb

Rails 3.1更新:正如一位评论者已经指出的那样,Rails 3.1确实支持has_many:通过超过一个级别的关联。

答案 1 :(得分:1)

我认为你有两个选择:

  1. 您可能需要重新考虑您的建模决策。例如,通过订单在客户和产品之间建立多对多关联。然后孵化合同。

  2. 使用命名范围(或Rails 3中的范围)来获取作者的订单。

  3. 如果按下,我会选择选项1.

答案 2 :(得分:1)

对于在Rails核心中包含补丁,该票证似乎不再活跃。我提交它......看起来它应该只适用于Rails。