2010-09-09 103 views
0

我使用ActiveRecord和Ruby(Rails之外)來跟蹤一些統計信息。。在ActiveRecord中查找方法

我向我的一個模型中添加了一個方法(total_cost),以使用當前模型中的一對列和另一個模型中的一列進行計算。

我真的很希望能夠使用我定義的方法來使用ActiveRecord的數學(平均,和)和普通的舊發現的一些規定,但是任何試圖這樣做的都會讓我(完全可以理解)列「錯誤,例如

Article.find(:all, :conditions => ["total_cost > ?", 300])

其結果是,我做的,我們可以描述爲蠻力forcey的方式,那就只要發現所有的文章,然後塞進每個人的total_value到一個數組,做的和與平均值這一點。

除了我在做什麼之外,我還有其他選擇嗎?我應該通過ActiveRecord查看MySQL本身來計算有問題的值嗎?

回答

2

你可以做

Article.sum(:total_cost, :conditions => ["total_cost > ?", 300]) 
Article.average(:total_cost, :conditions => ["total_cost > ?", 300]) 

鑑於TOTAL_COST是一個方法:

total_cost = 'freelance_cost + effort * editor.hourly_rate' 
Artice.sum(total_cost, :conditions => ["#{total_cost} > ?", 300], :joins => [:editor]) 
+0

我不能這樣做。 'total_cost'不是文章表中的列。這是我寫的一個總結'freelance_cost'和'effort'和'Article.editor.hourly_rate'的結果的方法。當我嘗試你在irb中建議的語法時,我得到:'ActiveRecord :: StatementInvalid:Mysql :: Error':'字段列表'中的未知列'total_cost' – mph 2010-09-09 13:45:25

1

一個選項是總成本計算到一個SQL表達式,這樣你就可以代替那個翻譯的方法表達式可能需要查詢中的「total_cost」。如果總成本計算起來很複雜或取決於幾個表格,這可能會非常麻煩。

如果可行,聽起來好像在Article模型上具有total_cost屬性是有意義的。當有人調用方法a.total_cost時,您可以使用回調模型進行更改並保存時進行計算,而不是進行計算。例如:

def before_save 
    self.total_cost = ... whatever ... 
end 

這將允許您使用總和和平均總成本。它比獲取文章更有效率,計算每個文章的總成本並聚合它們。它可能比每次請求時計算它更有效率。

該解決方案取決於總成本的值不會有很大變化。如果它總是根據各種不同的對象改變而變化,那麼檢測總成本必須改變的時間和以這種方式計算它的效率會更低。它肯定會讓你的計算更容易。

1

find方法創建SQL。你不能在其中使用total_cost方法。所以需要在SQL中編寫total_cost的計算。如果你想使用這個方法,你可以過濾所有必要的數據。

@articles = Article.find :all 
@articles = @articles.select {|a| a.total_cost > 300} 

但這種方式花費更多的資源..