2009-08-18 39 views
2

鑑於以下的ActiveRecord模型:ActiveRecord的:緩存和自動更新(冗餘)屬性 - 最佳實踐

class Tree < ActiveRecord::Base 
    # attributes: title, price, some_date 
    has_many :nodes 
end 

class Node < ActiveRecord::Base 
    # attributes: title, price, some_date 
    belongs_to :tree 
end 

一棵樹有許多節點(1'000 - 2'000)。 出於性能和其他原因,我想緩存Node實例中的price屬性。節點應該始終具有與其關聯樹相同的價格。這將使計算和查詢變得更加簡單快捷。

有沒有關於如何做到這一點的最佳做法?甚至可能是插件?

我想出到目前爲止是:

class Tree 
    after_save do; nodes.each{|n| n.update_attribute :price, price} if price_changed?; end 
end 

這可以成爲一個有點麻煩加班,因爲我需要很多這樣的緩存的屬性。

回答

2

解決方案的問題似乎是它將爲每個節點執行UPDATE語句。在樹的所有節點上使用單個UPDATE SQL語句可以使效率更高。

在Rails,這可以通過

class Tree 
    after_save do; nodes.update_all("price = #{price}") if price_changed?; end 
end 

見來完成:http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002273

注:此方法的缺點是它不會觸發節點上ActiveRecord的回調。