2011-01-30 15 views
10

dire che ho un modello chiamato "frutta" e una query è il ritorno di tutti i nomi di frutta distinti per @fruit:ActiveRecord matrice di oggetti a virgola stringa separata

  • rubino/oggetti: gli attributi di frutta! : fruit_name: attributes_cache arancione: {}

  • rubino/oggetto:! attributi frutta: fruit_name: mela attributes_cache: {}

  • rubino/oggetto: Attributi frutta: fruit_name: pesca attributes_cache: {}

comprendo (po) @fruit è una matrice costituita da matrici (oggetti ActiveRecord). Sto cercando di ottenere i nomi dei frutti restituiti in una stringa separata da virgole, come: "arancia, mela, pesca".

Se la matrice era composta da stringhe o numeri (anziché da matrici), so che potrei usare map w/.join (',') per fare ciò. Ho problemi con la sintassi aggiuntiva necessaria per fare riferimento agli array dell'array (i campi "fruit_name" degli array in ciascun indice di array).

So che questo avrebbe funzionato, solo non è sicuro come fare questo come un'iterazione dinamica:

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

risposta

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

Ora, quando un blocco è costituito da una chiamata di metodo senza parametri, e per un po' complicate ragioni, si può scrivere come

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


1. L'operatore unario & trasforma i proc in blocchi e blocchi in proc. Se l'operando non è né, allora prima chiama to_proc, se possibile. (E sì, Symbol ha un to_proc.) È anche più complicato di così, ma questo è il motivo per cui è un bel complemento perfetto per mappare.

+0

vorrei utilizzare la versione abbreviata di seguito –

16

Oppure utilizzare la scorciatoia proc:

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