0

2 つの名前付きスコープがあります...どちらも別々に機能しますが、組み合わせると機能しません。

  named_scope :total, :select => "COUNT(*) as days, AVG(price) as price, SUM(price) AS total", :group => :parent_id
  named_scope :currency, lambda { |code| { :select => "*, price * #{(CurrencyRate.get_rate("USD", (code ||= "USD") ,1))} AS price" } }

例:

c=Booking.total.currency("EUR").find_all_by_parent_id(63)

名前付きスコープの合計は機能しますが、通貨は機能しません...

c=Booking.currency("EUR").total.find_all_by_parent_id(63)

スコープという名前の通貨は機能しますが、合計は機能しません...

何か案は?

4

3 に答える 3

4

いくつか問題があると思います。

  • 両方のスコープが「価格として」定義されており、競合しています。これにより、無効な SQL が生成されます

  • 1 つのスコープには group 句がありますが、もう 1 つのスコープには select 句のグループ化されていない属性に対する集計関数がありません。これにより、無効な SQL が生成されます。

SQL を複雑にするスコープの代わりに、予約モデルで計算属性を使用することを検討してください。

class Booking
    def currency(code="USD")
        price * CurrencyRate.get_rate(code) ,1)
    end
end

次のことができるようになりました。

c=Booking.total.find_all_by_parent_id(63)
for booking in c
    puts booking.currency("EUR")
end

スコープを使用する必要がある場合は、それらを組み合わせることを検討してください。おそらく順列ごとに名前付きスコープを作成したくないと思いますが、何かを変更する必要があると思います。named_scope :currency_total を作成できます

named_scope :currency_total, lambda { |code| {:select => "COUNT(*) as days, 
           AVG(price * #{(CurrencyRate.get_rate("USD", (code ||= "USD") ,1))}) as price, 
           SUM(price * #{(CurrencyRate.get_rate("USD", (code ||= "USD") ,1))}) AS total", 
           :group => :parent_id }}
于 2009-10-16T14:25:12.567 に答える
1

結合された呼び出しの結果のクエリが両方のクエリの合計であることを (ログを介して) 確認してください。そうでない場合は、モデルを貼り付けてください...

于 2009-10-16T14:20:44.547 に答える