2010-11-22 7 views
22

Come faccio a convertire il gruppo di risultati di @ recipe.components.find ([# < Componente ingredient_id: 1>, # <Componente> ingredient_id: 2 >]) ad un array come [1,2]Come si converte un array di risultati ActiveRecord in un array normale?

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

Grazie!

risposta

31

è possibile utilizzare

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

Grazie! Avevo bisogno di @ result.map! {| i | i.ingredient_id} – Spechal

+0

'map' è tuo amico. Conoscere anche le terzine "ect": 'select',' reject' e 'inject'. –

24

Se si utilizza una versione recente di rubino, non v'è modo nuovo di fare questo:

@result.map(&:ingredient_id) 

Tempo saver, pulito e facile da interpretare.

+9

Sembra che Ruby stia acquisendo ancora più abilità di essere criptico. – Spechal

+1

@Spechal non deve essere criptico! In poche parole, il metodo map espone l'interfaccia di enumerazione sottostante per qualsiasi array, hash, ecc. La "&" è una notazione breve quando si desidera inviare/attivare un singolo metodo su ciascun oggetto dell'array. E in questo caso il: ingredient_id è la rappresentazione del simbolo del metodo. –

+3

@Spechal Oh e ho dimenticato di dirlo, se stai usando Rails 3.2.x c'è un metodo più semplice! Basta chiamare MyModel.find (* condizioni *). Pluck (&: ingrediente_id) ... questo è molto più veloce poiché il metodo di pluck è fondamentalmente una singola selezione, quindi non perderai tempo nel recuperare tutti i dati, presumendo naturalmente che tu voglio solo i valori in una singola colonna! –

5

Si potrebbe anche usare:

@result.pluck(:ingredient_id) 
Problemi correlati