2011-01-13 49 views
1

我試圖找出紅寶石取多一點.....的Ruby/Rails - 我如何將項目添加到一個對象,每個循環迭代

如果我有一個對象

@Trees = Tree.find(:all) 

然後做一個循環,每棵樹我發現,添加一些蘋果...

for tree in @trees 
    @apples = Apple.where(:tree_location = > tree.id) 
end 

如何添加自循環的每個迭代發現初始對象@apples額外的蘋果嗎?

我試圖

@apples = @apples + Apple.where(:tree_location = > tree.id) 

,但得到的錯誤「不能轉換成蘋果陣列」

感謝您的幫助....我在一個蘋果酒期限笑,毫無新意我知道

回答

2

如果您想對所有的樹木全部蘋果,你應該看看下面的查詢:

@trees = Tree.find(:all) 
@apples = Apple.where(:tree_location => trees.map(&:id)) 

生成以下SQL

select * from apples where tree_location in (... tree ids ...); 

它會給你所有屬於樹的蘋果,和成本,而不是隻有兩個查詢n + 1個

0

不太清楚我給你,但是......

trees = Tree.find(:all) 
apples = [] 
trees.each do |tree| 
    apples << Apple.where(:tree_location = > tree.id).to_a 
end 

apples = apples.flatten.uniq! 

puts apples.inspect 
+1

扁平化和uniq是什麼!做? – ChrisWesAllen

+0

'flatten'是因爲他在'Apple.where'上執行'to_a',導致產生一個數組數組。它不像其他解決方案那樣有效。 –

1

你可能會加上「所有」的結尾:

@apples = @apples + Apple.where(:tree_location = > tree.id).all 
相關問題