2010-11-22 85 views
22

如何轉換@ recipe.components.find的結果集([#<元器件ingredient_id:1>,#<元器件> ingredient_id:2 >])到一個數組如[1,2]如何將ActiveRecord結果數組轉換爲普通數組?

<% @ingredients.each do |ingredient| %> 
    <div class="field"> 
    <%= check_box_tag 'ingredients[]', ingredient.id, @recipe.components.find(:all, :select => "ingredient_id").include?(ingredient.id) %><%= ingredient.name %> 
    </div> 
<% end %> 

謝謝!

回答

31

可以使用

@result.map {|i| i.ingredient_id } 
+0

謝謝!我需要@ result.map! {| i | i.ingredient_id} – Spechal 2010-11-22 00:22:02

+0

'map'是你的朋友。還要了解「ect」三聯體:「select」,「reject」和「inject」。 – 2010-11-22 00:38:49

24

如果您使用的是最新的紅寶石版本,有做這種新的生活方式:

@result.map(&:ingredient_id) 

節省時間,乾淨和容易解釋。

+9

看起來像Ruby正在獲得更加神祕的能力。 – Spechal 2012-10-16 01:51:45

+1

@Spechal它不是神祕!簡單地說,map方法暴露了任何數組,哈希等的底層枚舉接口。當您希望在數組中的每個對象上發送/觸發單個方法時,「&」只是短符號。在這種情況下::ingredient_id是該方法的符號表示形式。 – 2012-10-16 12:16:49

+3

@Spechal哦,我忘了提及,如果你使用Rails 3.2.x,有一個更簡單的方法!只需調用MyModel.find(* conditions *)。pluck(&:ingredient_id)...因爲pluck方法基本上是單列選擇,所以您不會浪費時間獲取所有數據,當然假設您只需要單列中的值! – 2012-10-16 12:18:35

5

您還可以使用:

@result.pluck(:ingredient_id)