2010-11-22 14 views
22

Jak przekonwertować resultset z @ recipe.components.find ([# < Składnik ingredient_id: 1>, # < Składnik > ingredient_id 2 >]) z tablicy, na przykład [1,2]Jak przekonwertować tablicę wyników ActiveRecord na normalną tablicę?

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

Dzięki!

Odpowiedz

31

można użyć

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

Dzięki! Potrzebowałem @ result.map! {| i | i.ingredient_id} – Spechal

+0

'mapa' jest twoim przyjacielem. Poznaj także trójki "ect": "wybierz", "odrzuć" i "wstrzyknij". –

24

Jeśli używasz najnowszej wersji Ruby, nie jest niczym nowym sposobem, aby to zrobić:

@result.map(&:ingredient_id) 

oszczędność czasu, czyste i łatwe do interpretacji.

+9

Wygląda na to, że Ruby zyskuje jeszcze większą zdolność do bycia tajemniczą. – Spechal

+1

@Spektakl nie jest tajemniczy! Mówiąc najprościej, metoda map ujawnia bazowy interfejs wyliczeniowy dla dowolnej tablicy, hasza itp. "&" Jest po prostu krótką notacją, gdy chcesz wysłać/wywołać pojedynczą metodę dla każdego obiektu w tablicy. I w tym przypadku: ingredient_id jest reprezentacją symbolu metody. –

+3

@Spechal Aha i zapomniałem wspomnieć, jeśli używasz Rails 3.2.x jest prostsza metoda! Po prostu wywołaj MyModel.find (* conditions *). Pluck (&: ingredient_id) ... jest to znacznie szybsze, ponieważ metoda plucka jest w zasadzie pojedynczą kolumną, więc nie tracisz czasu na pobieranie wszystkich danych, zakładając oczywiście, że chcą tylko wartości w jednej kolumnie! –

5

Można również użyć:

@result.pluck(:ingredient_id) 
Powiązane problemy