0

次のシナリオがあります。

User->HABTM->businesses

Suppliers->HABTM->businesses

Suppliers->HAS_MANY->Payments

ビジネス -> サプライヤーおよびユーザー -> ビジネス関係を記述する HABTM 関係を通じて、ユーザーのすべての支払いを取得する方法を理解するのに本当に苦労しています。

私は、サプライヤーのビジネス関係を通じてユーザーに属するすべての支払いを行っています。

私はこれを SQL で非常に簡単に行うことができますが、レールの方法で行うのに問題があります。

これは、投稿モデルを介してユーザーに属するすべてのコメントを取得する投稿に似ています。

どんな助けでも大歓迎です。

それは可能ですか?

私は現時点でこれをやっています:

has_many :payments,:finder_sql => Proc.new {
  %Q{
    SELECT DISTINCT *
    FROM payments 
    INNER JOIN businesses_users ON businesses_users.user_id
    INNER JOIN businesses_suppliers ON businesses_suppliers.business_id        
    WHERE payments.supplier_id = businesses_suppliers.supplier_id AND businesses_users.user_id = #{id}
    ORDER BY payments.created_at
  }}

これにより、user.paymentsを実行できます

4

1 に答える 1

1

ちょっと時間に追われましたが、参加したかったのです。まず、モデルは、ユーザーとサプライヤーの間に IS A 関係がある可能性があることを示唆しているようです。その場合、ポリモーフィックな関連付けを使用できます。そうでない場合は、activerecord クエリ インターフェイス内の includes オプションを調べます。このようにして、基本的に AR に関係を連鎖的に積極的にロードさせることができます。例は次のようになります。

all_users_and_their_pmts = User.includes(:businesses => {:suppliers => :payments })

これを行う別の、しかし非常に非効率的な方法は次のとおりです。

user_record.businesses.map {|b| b.suppliers.map {|s| s.payments}}.flatten

これにより、一連の支払いが得られます。上記のように未加工の SQL を使用すると、これよりもはるかに効率的になります。これは、activerecord が map{} 内で呼び出しを連鎖できないためです。:include は、より慣用的な方法だと思いますが、解決策は恐ろしいものではありません。

于 2012-04-18T11:55:30.617 に答える