[英].finding on a method in ActiveRecord
我正在使用ActiveRecord和Ruby(在Rails之外)跟蹤一些統計信息。
我向一個模型中添加了一個方法( total_cost
),以使用當前模型中的幾個列以及另一個模型中的列進行計算。
我真的很希望能夠使用ActiveRecord的一些規定(使用我定義的方法進行數學計算(求和,求和)和簡單的發現),但是任何嘗試都會使我(一個完全可以理解的)“未知列”錯誤,例如
Article.find(:all, :conditions => ["total_cost > ?", 300])
結果,我正在以一種可以描述為蠻力的方式做事,只是找到所有文章,然后將每個人的total_value填充到一個數組中,然后對其求和和求平均值。
除了我在做什么以外,我還有其他選擇嗎? 我是否應該將ActiveRecord移到MySQL本身來計算有問題的值?
你可以做
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])
一種選擇是將計算總成本的方式轉換為SQL表達式,以便您可以將該表達式替換為查詢中可能需要的“ total_cost”的任何引用。 如果總成本計算復雜或依賴於多個表,那么這可能非常麻煩。
如果可行,在Article
模型上具有total_cost
屬性似乎確實有意義。 當有人調用方法a.total_cost
您a.total_cost
計算就可以在模型更改時使用回調進行計算並保存。 例如:
def before_save
self.total_cost = ... whatever ...
end
這樣一來,您就可以使用總和來計算總成本。 這比獲得文章,計算每個文章的總成本然后匯總它們要有效得多。 它可能比每次請求都更有效。
該解決方案取決於總成本值的變化不大。 如果它總是根據各種不同對象的變化而變化,那么檢測總成本何時必須變化將更加尷尬,而以這種方式計算總成本則效率較低。 當然,這肯定會使您的計算更容易。
find
方法創建SQL。 您不能在其中使用total_cost
方法。 因此,需要用SQL編寫total_cost
的計算。 如果要使用該方法,則可以從所有過濾必要的數據。
@articles = Article.find :all
@articles = @articles.select {|a| a.total_cost > 300}
但是這種方式花費更多的資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.