2011-01-30 17 views
10

Say mam model o nazwie „Fruit” i kwerenda zwraca wszystkie różne nazwy owocowe do @fruit:ActiveRecord tablicę obiektów oddzielonych przecinkami ciąg

  • rubinowe/PRZEDMIOT: owocowe atrybuty : fruit_name: pomarańczowy attributes_cache: {}

  • rubin/przedmiot: Fruit atrybuty: fruit_name: jabłko attributes_cache: {}

  • rubin/Obiekt owoców atrybutów: fruit_name: brzoskwinia attributes_cache: {}

I rozumie (nieco) @fruit jest macierz składa się z tablic (ActiveRecord obiektów). Próbuję uzyskać nazwy zwracanych owoców w oddzielonym przecinkiem ciągu, np .: "pomarańczowy, jabłko, brzoskwinia".

Jeśli tablica składa się z ciągów lub liczb (zamiast tablic), wiem, że mógłbym użyć mapy w/.join (","), aby to zrobić. Mam problem z dodatkową składnią potrzebną do odniesienia się do tablic w tablicy (pola 'fruit_name' w tablicach w indeksie każdej tablicy).

wiem, że to będzie działać, po prostu nie wiem, jak to zrobić, jako dynamiczny iteracji:

@fruit_string = @fruit [0] .fruit_name + '' + @fruit [1] .fruit_name + ' ”+ @fruit [2] .fruit_name

Odpowiedz

29
@fruit_string = @fruit.map { |f| f.fruit_name }.join ',' 

teraz, gdy blok składa się z wywołania metody bez parametrów, a dla nieco skomplikowanych powodów, można napisać go jak

@fruit_string = @fruit.map(&:fruit_name).join ',' 


1. Jednoargumentowy operator & zamienia procenty w bloki i bloki w proc. Jeśli operand nie jest żadnym, to najpierw wywołuje to_proc, jeśli może. (I tak, Symbol ma to_proc.) Jest to jeszcze bardziej skomplikowane, ale to jest powód, dla którego jest to miłe, gęste uzupełnienie map.

+0

użyłbym wersję skróconą poniżej –

16

też użyć skrótów proc:

@fruit_string = @fruit.map(&:fruit_name).join(',') 
Powiązane problemy