2010-11-22 6 views
22

Comment puis-je convertir resultset de @ recipe.components.find ([# < Component ingredient_id: 1>, # <Component> ingredient_id: 2 >]) à un tableau tel que [1,2]Comment convertir un tableau de résultats ActiveRecord en tableau normal?

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

Merci!

Répondre

31

vous pouvez utiliser

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

Merci! J'avais besoin de @ result.map! {| i | i.ingredient_id} – Spechal

+0

'map' est votre ami. Découvrez également les triplets "ect": 'select',' reject' et 'inject'. –

24

Si vous utilisez une version récente de rubis, il y a une nouvelle façon de le faire:

@result.map(&:ingredient_id) 

Gain de temps, propre et facile à interpréter.

+9

On dirait que Ruby gagne encore plus de capacité à être cryptique alors. – Spechal

+1

@Spechal ce n'est pas d'être cryptique! Autrement dit, la méthode map expose l'interface d'énumération sous-jacente pour n'importe quel tableau, hash, etc. Le "&" est une notation courte lorsque vous souhaitez envoyer/déclencher une seule méthode sur chaque objet du tableau. Et dans ce cas, le: ingrédient_id est la représentation symbolique de la méthode. –

+3

@Spechal Oh et j'ai oublié de mentionner, si vous utilisez Rails 3.2.x il y a une méthode plus simple! Appelez simplement MyModel.find (* conditions *) .pluck (&: ingredient_id) ... c'est beaucoup plus rapide puisque la méthode de plumage est essentiellement une sélection de colonne unique, donc vous ne perdrez pas de temps à aller chercher toutes les données, en supposant bien sûr que vous ne veulent que les valeurs dans une seule colonne! –

5

Vous pouvez également utiliser:

@result.pluck(:ingredient_id) 
Questions connexes