2011-01-30 15 views
10

separados Decir que tengo un modelo llamado "fruta" y una consulta es devolver todos los nombres de frutas distintas a @fruit:activerecord matriz de objetos a coma cadena

  • rubí/objeto: atributos de la fruta! : fruit_name: attributes_cache naranja: {}

  • rubí/objeto: atributos de frutas: fruit_name: attributes_cache manzana: {}

  • rubí/objeto: Atributos Fruit: fruit_name: melocotón attributes_cache: {}

entiendo (un poco) @fruit es una matriz compuesta de Arrays (objetos ActiveRecord). Estoy tratando de obtener los nombres de fruta devueltos en una cadena separada por comas, como: "naranja, manzana, melocotón".

Si la matriz se compone de cadenas o números (en lugar de matrices), sé que podría usar map w/.join (',') para hacer esto. Estoy teniendo problemas con la sintaxis adicional necesaria para hacer referencia a las matrices en la matriz (los campos 'fruit_name' de las matrices en cada índice de la matriz).

Sé que esto iba a funcionar, simplemente no está seguro de cómo hacer esto como una iteración dinámica:

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

Respuesta

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

Ahora, cuando un bloque consiste en una llamada al método sin parámetros, y por tanto complicadas razones, se puede escribir como

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


1. El operador unario & convierte los procs en bloques y los bloques en procs. Si el operando no es ninguno, primero llama a_proc, si puede. (Y sí, Symbol tiene un to_proc.) Es incluso más complicado que eso, pero esa es la razón por la cual es un complemento bastante bueno para hacer un mapa.

+0

me gustaría utilizar la versión abreviada a continuación –

16

O utilizar la abreviatura proc:

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