2010-07-18 25 views
5

Estoy enviando datos a través de get y necesito ponerlos en una matriz int para usarlos en un find. aquí está mi código:ruby ​​rails convertir params a int array

@found = Array.new 
    params['candidate'].each do |c| 
    @found << c.to_i 
    end 

Mi URL se parece a esto

http://localhost:3000/export/candidate?candidate[]=3&candidate[]=4&commit=Export 

Si se hace ninguna diferencia lo estoy usando para este hallazgo

@candidate = Candidate.find(:all, :conditions => ["candidates.id IN ?", @found]) 

Pero actualmente no lo hace ponerlo en una matriz real porque me sale este error

Mysql::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '4)' at line 1: SELECT * FROM `candidates` WHERE (candidates.id IN 4,2) 

Faltan los soportes alrededor de la matriz

¡Gracias y buenos días!

Alex

Respuesta

14

Sólo hay que poner paréntesis alrededor de su?

@candidate = Candidate.find(:all, :conditions => ["candidates.id IN (?)", @found]) 

Además, su primer fragmento se puede plegar hacia abajo para:

@found = params['candidate'].map(&:to_i) 
+0

Gracias por su ayuda! ¿Qué significa esto &:? – Alex

+1

Es una manera fácil de pasar un bloque que simplemente llama al método dado en el argumento pasado al bloque. Hay una buena explicación en http://pragdave.pragprog.com/pragdave/2005/11/symbolto_proc.html – Gareth

+0

¡Gracias, ruby ​​es un lenguaje tan genial! – Alex

1

Toda la conversión se está haciendo es innecesaria. Puede pasar el conjunto de cadenas como una entrada a la consulta (siempre que los valores de cadena representen números).

Usted puede obtener lo que necesita en una sola línea:

Candidate.find_all_by_id(params[`candidate`]) 

que es igual que:

Candidate.find(:all, :conditions => {:id => params[`candidate`]}) 

que es igual que:

Candidate.find(:all, :conditions => ["id IN (?)",params[`candidate`]]) 

su intento original no lo hizo funciona porque no has puesto corchetes después de la cláusula IN.