2011-01-18 21 views
4

を通じて、私はRailsはネストされたにhas_manyをサポートしていません知っている:早けれレール2とネストされたにhas_many:レールで3

ので、トークやパッチについてのオープンチケットがあっただけれども関係を通じて、私は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 

しかし残念ながら、あなたがすることはできません - で少なくともプラグインなしで。だから、私の質問は、唯一の結合が結合モデル、契約の間にあるとき、著者の注文のすべてにアクセスするための最良のアプローチは何ですか?

+4

これは、has_manyがネストされたようです:throughはRails 3.1、FYIで動作します。 – Slick23

答えて

8

となるだろう、とだけ、その後のRails 3にスコープあなたは、ルックアップのためにそれを使用したいですこれを行うには最適な方法です。あるいは、クラスメソッドを実装することもできます。私は最近、教えクラスに一例として、この種のものを持っていた

、コードのRailsの3バージョンはここにある: https://github.com/wolframarnold/Efficient-TDD-Rails3/blob/master/app/models/user.rb

は、項目メソッドの定義を参照してください。https://github.com/wolframarnold/Efficient-TDD-Rails3/blob/master/spec/models/user_orders_spec.rb Rails 3.1アップデート:既にコメント欄に記載されているように、Rails 3.1はhas_many:throughの複数レベルの関連付けをサポートしています。

1

私はそれを見ると、あなたが2つのオプションがあります:あなたは、モデリングの決定を再検討する必要があるかもしれません

  1. を。たとえば、注文を介して顧客と製品の間に多対多関連を確立します。そして、その契約をインキュベートする。

  2. 著者の注文をフェッチするために、名前付きスコープ(またはRails 3のスコープ)を使用します。

押された場合は、ネストされた協会を通じてオブジェクトを作成しようとしていない場合、私はオプション1

+0

ええ、私は2人の間でジョインテーブルを追加することでそれが処理されると考えました。私は、しかし、名前が付いたスコープのラインに沿って何かがあっても動作すると思ったが、それらに精通していなかった。私はもうSQLを書くのは素晴らしいことではなく、何年も前にそれをやっていない。 – Slick23

+0

名前付きスコープにSQLを書き込む必要はありません。それが名前付きスコープの使用の要点です。 SQLはありません! – Shreyas

+0

私が見た例はすべてSQLを持っていました。 – Slick23

1

Railsコアにパッチを含めると、チケットはもうアクティブではないようです。私はそれを提出するだろう...それはレールでうまくいくべきものでなければならないようだ。

関連する問題