4

我知道 Rails 不支持嵌套的 has_many :through 关系,尽管早在 Rails 2 以来就有关于补丁的讨论和公开票。

我确实遇到了一个非常漂亮的插件,但是主分支不能与 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

因此,通过将其添加到 Author 模型中,能够获得订单将是一件很棒的事情:

has_many :orders, :through => :products

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

4

3 回答 3

8

如果您不尝试通过嵌套关联创建对象,并且只想将其用于查找,那么 Rails 3 中的范围是执行此操作的好方法。或者,您可以实现一个类方法。

我在最近教的一堂课中就有过这样的例子,Rails 3 版本的代码在这里: https ://github.com/wolframarnold/Efficient-TDD-Rails3/blob/master/app/模型/用户.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 :through 关联超过一层。

于 2011-01-19T02:41:21.477 回答
1

如我所见,您有两个选择:

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

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

如果按下,我会选择选项 1。

于 2011-01-18T05:15:33.687 回答
1

在 Rails 核心中包含补丁时,该票似乎不再有效。我会提交它......似乎它应该只是在 Rails 中工作的东西。

于 2011-01-19T15:44:32.537 回答