2009-10-16 60 views
0

我有两个命名作用域...两者都单独工作,但合并时不起作用。rails命名为范围问题

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

我认为你有几个问题。

  • 两个范围界定“为代价”和他们发生冲突,这会产生无效的SQL

  • 一个范围内拥有一批条款,但对方并没有对非分组属性聚合函数在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 }} 
+0

我走了更长和最后的方法......它工作正常。谢谢 – holden 2009-10-16 14:48:43

1

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

3

可悲的是named_scope没有链接什么比成功的那一刻条件别的。

:select将被设置只有一个命名的范围。所以你应该去用jrhicks的方法。

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