2014-10-16 45 views
0

給定一個數據庫結果集,我想有效地裝飾它的所有項目。如何有效地初始化裝飾器集合?

這是我做它目前的方式:

@results = MyModel.all.map { |object| MyModelDecorator.new(object) } 

我做的這一切都在我的控制器的時候,所以我必須要遍歷所有的物品來裝飾它們,每次實例化裝飾類。

然後在模板中,我再次遍歷結果以顯示它們。所以我做了2次迭代。

這樣高效還是有更好的辦法呢?

回答

1

你可以引入一個簡單的方法來簡化事情。

# 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

+1

您也可以從模型到一個裝飾對象時,其所謂的緩存,然後用|| = – DiegoSalazar 2014-10-16 16:15:42

+1

我想伊娃是被實例化一次委託方法緩存裝飾對象:'@decorated || = MyModelDecorator.new self' – 2014-10-18 09:03:42

0

這樣高效還是有更好的方法來做到這一點?

要確定成本,您需要兩個數據。

  1. 你的裝飾的構造
  2. 模型的實例數量的成本

大多數裝飾非常簡單的紅寶石對象,因此有便宜的構造。

紅寶石可以實例數百萬個對象每秒:

require 'benchmark' 
puts Benchmark.measure { 1_000_000.times do Object.new end } 
#=> 0.180000 0.000000 0.180000 ( 0.179265) 
+0

正如你所說,裝飾器是一個普通的舊ruby對象,沒有構造器。我主要關心的是內存使用情況,因爲每次訪問可能會有數十個結果進行裝飾。使用普通的老式Rails幫手會更便宜,我認爲... – 2014-10-17 10:51:08