2009-05-25 8 views
1

Ruby on railでは、モデルには注文と支払いが含まれています。 注文と支払いの間に1対多の関係があります。 注文モデルでは、 has_many:payments、as as =>:payable 支払いレコードにはorder.idに設定されたpayable_idがあります。ROR- 1対多の関係でFindを使用することはできません

レポートでは、特定のタイプのオーダーに属するすべての支払いを選択したいと考えています。 使用: payments = Payment.find(:all、:conditions =>条件) 条件に 'payable.type = "a"を追加すると機能しません。 ActiveRecordはこれを正しいjoinステートメント(payable_id = order.idとorders.type = 'a')に展開していないようです。 ここに明示的なSQLを使用することはできません。条件には、コードの前に挿入されている他のものが含まれているからです。 おかげで、 ラフィLipkin

答えて

1

incliding試してみて、かなり関連エイリアスよりも、条件に実際のテーブルのid名を参照:

find(:include => "payments", :conditions => ["payment.type = ?", "x"] 
0

あなたは「支払いタイプ」を言及。それらがかなり静的な場合は、単一のテーブル継承(STI)を使用して、異なる支払いタイプをサブクラス化することを検討しましたか?それから、Railsはすべての魔法をフィルターにかけます。

など。

class CreditCardPayment < Payment 
... 
end 

最初は別の動作を示す必要はありません。おそらく、支払に関するさまざまなデータや多態的な振る舞いを持つことが本当に便利であることが分かります。

2

条件句が間違っています。 payable_idpayable_typeOrder

has_many :payments, :as => :payable 

これはPayment

belongs_to :payable, :polymorphic => true 

これはpayments表は、ノートの2つの列を持っていることを意味していることを私に伝えます

あなたの状態。これはまた、PaymentsOrdersだけでなく、他のモデル(CreditCardBalances、知っている人)にも適用できることを意味します。

特定のタイプの支払い、つまり特定のクラスのインスタンスに属している支払いを照会する場合は、フィールドpayments.payable_typeを照会する必要があります。これは正常に動作します:

Payment.find(:all, :conditions => "payable_type = 'Order'") 

Here's a gist私はこれをテストするために何をしたかを示しています。作成されたモデルは、上記のように設定されます。

それは簡単だ場合は、名前のスコープの中にそれを抽出できていることを忘れないでください:

named_scope :on_orders, :conditions => "payable_type = 'Order'" 

それ

Payment.on_orders 

または動的になり、どの:

、その後になり
named_scope :on, lambda { |type| { :conditions => "payable_type = '#{type.to_s}'" } } 

それ

Payment.on(Order) # or Payment.on(CreditCardBalance) or Payment.on("Order") 
+0

ありがとうございました。あなたが正しいです。支払いは他のタイプに属することができます。 条件にpayment.typeを追加しようとします。 –

+0

Sigh。それは "payment.type"ではありません。それをデータベースで見る。これは「payments.payable_type」です。 –

関連する問題