2012-02-13 20 views
2

我有一個ActiveRecord模型,它有兩個數據庫屬性,totalprocessing_fees使用ActiveRecord作用域進行多列計算?

它定義的各種領域,比如(僅僅作爲示例):

class Item < ActiveRecord::Base 
    scope :completed, joins(:order).where(:orders => {:status => Order::Status::COMPLETED}) 
    scope :for_client, lambda {|client| where("client_id=?", client.id)} 
...etc... 
end 

我可以很容易地做一些事情,如:

Item.completed.for_client(client).sum(:total) 

但我想要做的是一樣的東西:

Item.completed.for_client(client).calculate(:total - :processing_fees) # obv not valid 

有沒有辦法做這樣的事情?

回答

6

像這樣的東西應該工作:

Item.completed.for_client(client).calculate(:sum, "item.total - item.processing_fees") 
+0

好吧,那* *很容易。我沒有想到你可以在那裏表達一個表情。在我看來,也許文檔需要更新,因爲它說: 'calculate(operation,column_name,options = {}) 這將計算給定列中的聚合值。' – denishaskin 2012-02-13 17:57:20

+0

@dwhsix:文檔有時會有點薄在這樣的事情上。 Rails經常允許在這些地方放入一段sql。通常經常使用不同類型的參數,例如哈希或數組,其中基本文檔只會談到字段名稱的單個符號。這不僅適用於ActiveRecord。一些助手是很多不同輸入方法的好例子。 – 2012-02-13 18:30:05

+0

同意。我實際上更仔細地再看了文檔,打算也許提供一個編輯。它有一個* final *簡短的例子,表明你可以使用SQL表達式,但它有點微妙。我想也許文檔需要說「column_name或SQL表達式」或類似的東西。我會盡量記住在文檔中的某處進行更改。 – denishaskin 2012-02-14 02:25:31