0

我有两个命名范围......它们都单独工作,但组合时不起作用。

  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

我认为你有几个问题。

  • 两个范围都定义了“as price”并且它们冲突,这将产生无效的 SQL

  • 一个范围有一个 group 子句,但另一个在 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 回答
3

可悲named_scope的是,目前除了条件之外没有其他任何东西。

:select由指定范围之一设置。因此,您应该采用jrhicks方法。

顺便说一句:这就是为什么你应该开始每一个:select => "model_name.*, ...,以便 Rails 获取模型的字段。否则,您将遇到其他问题/错误。

于 2009-10-16T14:38:57.737 回答
1

请确保(通过日志)组合调用的结果查询是两个查询的总和,如果是,那么 2 个查询的组合是一个空集,您需要重新考虑它们一起工作。如果不是,请粘贴您的模型...

于 2009-10-16T14:20:44.547 回答