2010-11-22 20 views
22

nasıl @ recipe.components.find arasında resultset dönüştürme yapmak ([# < Bileşen ingredient_id: 1>, # < Bileşen > ingredient_id: 2 >]) bir dizi örneğin [1,2]ActiveRecord sonuç dizisini normal diziye nasıl dönüştürebilirim?

<% @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 %> 
olarak

Teşekkürler! ,

@result.map(&:ingredient_id) 

Zaman tasarrufu:

cevap

31

Eğer daha özlü @result.map! &:ingredient_id

+0

Teşekkür! @ Result.map'e ihtiyacım vardı! {| i | i.ingredient_id} – Spechal

+0

'map' arkadaşın. Ayrıca "ect" üçlüsünü de tanıyın: 'select', 'reddet' ve 'inject '. –

6

Veya kullanabilirsiniz, bunun için yeni bir yol yoktur Temiz ve yorumlanması kolaydır.

24

Eğer yakut güncel bir sürümünü kullanıyorsanız

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

Ruby'nin daha sonra şifreli olma yeteneğini daha da artırdığını görüyor. – Spechal

+1

@Spechal, şifreli olmamak! Basitçe söylemek gerekirse, harita yöntemi herhangi bir dizi, karma, vb. Için temel numaralandırma arayüzünü ortaya koyar. Dizideki her nesneye tek bir yöntem göndermek/tetiklemek istediğinizde "&" ifadesi sadece kısa gösterimdir. Ve bu durumda: ingredient_id, yöntemin sembol temsilidir. –

+3

@Spechal Oh ve Unutmayalım, Rails 3.2.x kullanıyorsanız daha basit bir yöntem var! Sadece MyModel.find (* terms *) 'ı arayın. Pluck (&: ingredient_id) ... pluck metodu temelde tek bir sütun seçimi olduğundan çok daha hızlıdır, böylece tüm verilerin alınmasında zaman kaybetmezsiniz. sadece değerleri tek bir sütunda istiyorum! –

5

Ayrıca kullanabilirsiniz:

@result.pluck(:ingredient_id) 
İlgili konular