2012-07-11 42 views
0

我有我認爲是鏈接兩個範圍(Rails 3.2.5)的簡單問題。Rails 3作用域,組合條件與聚合(總和)結果的錯誤

我有一個名爲Point的模型,其中字段amounttransaction_date等等。用戶可以獲得各種活動的點數,並且在使用之前它們「可用」,這是交易的一部分,此時transaction_date已更新且不再爲空。

所以我有這樣一個範圍:

scope :available, where("transaction_date IS NULL OR transaction_date = ''") 

和它的偉大工程,返回Point對象的正確收集。所以我可以做

> Point.available 
=> [#<Point id: 123, amount: 22, transaction_date: nil >][#<Point id: 456, amount: 33, transaction_date: nil >] 

如果我想知道的可用點數的總和,我可以做

> Point.available.sum("amount") 
=> 55 

但是,如果我嘗試再進行一次範圍像

scope :available, where("transaction_date IS NULL OR transaction_date = ''") 
scope :total_available, available.sum("amount") 

我得到錯誤

NoMethodError: undefined method `default_scoped?' for 22:Fixnum 

或者如果我更改範圍所以它的sum("amount").available我得到的錯誤

NoMethodError: undefined method `available' for 55:Fixnum 

我還可以通過添加在:available定義的條件使:total_available範圍內的工作,但是這不是很乾。

我在這裏錯過了什麼?

回答

5

表達available.sum得到評估馬上讓你的企圖相當於

scope :total_available, 55 

或者

scope :total_available, 55.available 

這顯然是錯誤的。個人而言,我會使用一個類的方法爲這個

def self.total_available 
    available.sum(:amount) 
end 

我覺得範圍,有一個範圍的集合:它沒有任何意義,我的範圍是數字 - 一件事,他們會是作用域安:我't鏈其他範圍到

+0

謝謝@Frederick鍾 - 謝謝你的錯誤的解釋,這有助於我瞭解失敗。我也認爲你的解決方案是實用的,你的理由是合乎邏輯的。然而,範圍在AREL中實現並且[在此處記錄](http://guides.rubyonrails.org/active_record_querying.html#calculations),並顯示了一種類似於礦井鏈的情況,用作附加細化。也許我的問題應該是「Rails有沒有正確的方法?」使用總和像'sum'這樣的範圍? – 2012-07-11 18:48:39

+0

我可以在範圍中看到運行計算的示例,但沒有定義作爲計算範圍的示例 – 2012-07-11 18:55:46

+0

是的,顯然它們與常規示波器有點不同。無論如何,您的解決方案几乎與範圍相同。 – 2012-07-11 19:36:50