給定一個數據庫結果集,我想有效地裝飾它的所有項目。如何有效地初始化裝飾器集合?
這是我做它目前的方式:
@results = MyModel.all.map { |object| MyModelDecorator.new(object) }
我做的這一切都在我的控制器的時候,所以我必須要遍歷所有的物品來裝飾它們,每次實例化裝飾類。
然後在模板中,我再次遍歷結果以顯示它們。所以我做了2次迭代。
這樣高效還是有更好的辦法呢?
給定一個數據庫結果集,我想有效地裝飾它的所有項目。如何有效地初始化裝飾器集合?
這是我做它目前的方式:
@results = MyModel.all.map { |object| MyModelDecorator.new(object) }
我做的這一切都在我的控制器的時候,所以我必須要遍歷所有的物品來裝飾它們,每次實例化裝飾類。
然後在模板中,我再次遍歷結果以顯示它們。所以我做了2次迭代。
這樣高效還是有更好的辦法呢?
你可以引入一個簡單的方法來簡化事情。
# In the model...
class MyModel
def decorated
MyModelDecorator.new self
end
end
# In the controllers...
@decorated_results = MyModel.all.map &:decorated
# In the views...
for decorated_model in @decorated_results
<%= decorated_model.data %>
end
您也不應該遍歷結果集兩次。消除上述呼籲,只有裝飾的東西,當你真的需要:
# In the controllers...
@results = MyModel.all
# In the views...
for model in @results
<%= model.decorated.data %>
end
此外,嘗試確定,如果你真的需要裝飾結果集中的每一個元素。每次你做,你正在創造另一個對象;從性能的角度來分配內存和其他這些煩人的東西。你創造的對象越少越好。
另外,對於大的結果集,operate in batches。
這樣高效還是有更好的方法來做到這一點?
要確定成本,您需要兩個數據。
大多數裝飾非常簡單的紅寶石對象,因此有便宜的構造。
紅寶石可以實例數百萬個對象每秒:
require 'benchmark'
puts Benchmark.measure { 1_000_000.times do Object.new end }
#=> 0.180000 0.000000 0.180000 ( 0.179265)
正如你所說,裝飾器是一個普通的舊ruby對象,沒有構造器。我主要關心的是內存使用情況,因爲每次訪問可能會有數十個結果進行裝飾。使用普通的老式Rails幫手會更便宜,我認爲... – 2014-10-17 10:51:08
您也可以從模型到一個裝飾對象時,其所謂的緩存,然後用|| = – DiegoSalazar 2014-10-16 16:15:42
我想伊娃是被實例化一次委託方法緩存裝飾對象:'@decorated || = MyModelDecorator.new self' – 2014-10-18 09:03:42