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/ models/user.rb

items メソッドの定義を参照してください。仕様はこちら: https://github.com/wolframarnold/Efficient-TDD-Rails3/blob/master/spec/models/user_orders_spec.rb

Rails 3.1 の更新: 1 人のコメンターが既に指摘したように、Rails 3.1 は has_many : をサポートしており、1 レベル以上の深さの関連付けをサポートしています。

于 2011-01-19T02:41:21.477 に答える
1

Railsコアにパッチを含めるためのチケットは、もはやアクティブではないようです。私はそれを提出したいと思います...それはRailsで動作するものであるべきだと思われます。

于 2011-01-19T15:44:32.537 に答える
1

ご覧のとおり、2つのオプションがあります。

  1. モデリングの決定を再検討する必要がある場合があります。たとえば、注文を通じて顧客と製品の間に多対多の関連付けを確立します。そして契約を孵化させます。

  2. 名前付きスコープ (Rails 3 ではスコープ) を使用して、作成者の注文を取得します。

押された場合、オプション1を使用します。

于 2011-01-18T05:15:33.687 に答える