2010-11-22 56 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) 
相关问题