2010-11-22 5 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

+0

'map'はあなたの友人です。また、 "select"、 "reject"、 "inject"という3つの要素を知ることもできます。 –

24

を使用することができ、これを行うための新しい方法があります:

@result.map(&:ingredient_id) 

時間の節約、清潔で解釈しやすい。

+9

Rubyのように見えますが、さらに潜在的に潜在的になります。 – Spechal

+1

@Spechalそれは潜在的ではありません!簡単に言えば、mapメソッドは、配列、ハッシュなどの基になる列挙インタフェースを公開します。配列の各オブジェクトに対して単一のメソッドを送信/トリガーしたいときは、「&」は短い表記です。この場合、:ingredient_idはメソッドのシンボル表現です。 –

+3

@Spechalああ、忘れてしまったのは、あなたがRails 3.2.xを使用しているなら、もっと簡単な方法です! MyModel.find(* conditions *)を呼び出してください。pluck(&:ingredient_id)...これは、pluckメソッドが基本的に単一の列選択であるため、はるかに高速です。したがって、すべてのデータをフェッチする時間を無駄にしません。単一の列の値だけが必要です! –

5

また、使用することができます

@result.pluck(:ingredient_id) 
関連する問題