Problema para poner variable en ": conditions =>"

fields = “id like ? OR name like ? OR created_at like ?”
query = “%19%”, “%19%”, “%19%”
si pongo esto:
:conditions => [ fields, query ]
me pone errores

y si escribo la variable de query:
:conditions => [ fields, “%19%”,"%19%","%19%" ]
funciona

cual es la solucion a esto?

hola,

fields = “id like ? OR name like ? OR created_at like ?”
query = “%19%”, “%19%”, “%19%”
si pongo esto:
:conditions => [ fields, query ]
me pone errores

y si escribo la variable de query:
:conditions => [ fields, “%19%”,"%19%","%19%" ]
funciona

:conditions acepta varias formas (hubo un post hace poco con título “un
buscador” en el que salían unas cuantas cosas interesantes).

en el caso que te funciona, estás usando la forma de un array con una
cadena como primer parámetro y luego parámetros posicionales. Como tu
variable query ya apunta a un array, podrías hacer por ejemplo esto

:conditions query.insert(0,fields)

o esto otro (requiere algo más de explicación sobre el splat operator,
que está en el post que te decía antes)

:conditions=>[fields,*query]

por último, para cuando hay varios parámetros en una query, es
recomendable utilizar parámetros con nombre + una hash. El usar
parámetros posicionales hace que el código quede algo menos claro y es
una solución menos robusta en el sentido de que si cambias la query
puedes obtener resultados equivocados. En el caso del binding por
nombre, aunque te cambien la query no tienes problema.

saludos,

javier ramírez

Sergio L.
escribió:> cual es la solucion a esto?

fields = “id like ? OR name like ? OR created_at like ?”
query = ["%19%", “%19%”, “%19%”]
:conditions => [ fields, *query ]

En ruby puedes hacer
a,b,c=1,2,3

con lo que consigues que
a == 1
b == 2
c == 3

Si haces
a,b,c=1,2

lo que consigues es
a == 1
b == 2
c == nil

y si haces a,b = 1,2,3
a == 1
b == 2
y el 3 se descarta

Lo que hace el asterisco es expandir el contenido del array, por eso
a=[1,2,3]
b=[1,*a]
obtienes
b==[1,1,2,3]

Aprovecho la ocasion para recomendarte dedicarle un tiempo a estudiar
ruby y su sintaxis, que son los pilares basicos de rails.

ya lo resolvi de una formal pero no total mente funcional y ahora
este el el problema:
ya vi lo que dices y si es buen ejemplo; pero lo q io propongo
en mi proyecto es hacer el query con una linea de codigo aprtir de
recibri un string mira:
cliente envia:
params[:fields]="[“id”,“name”,“created_at”]"

fields = params[:fields].gsub(/[[|"]/,"").gsub(/[,]/," like
‘#{params[:query]}’ OR “).gsub(/[]]/,” like ‘#{params[:query]}’")

total los convierto y obtengo esto:
id like ‘19’ OR name like ‘19’ OR created_at like ‘19’
:conditions => [ fields ]

totalmente funcional

pero cuando qiero poner alos like el %% ya no fucniona
fields = params[:fields].gsub(/[[|"]/,"").gsub(/[,]/," like
‘%#{params[:query]}%’ OR “).gsub(/[]]/,” like
‘%#{params[:query]}%’")

ya no fucniona si saca e l string

id like ‘%as%’ OR name like ‘%as%’ OR created_at like ‘%as%’

pero el me saca un error q dice asi q sucede?=
ArgumentError (malformed format string - %a):

Hola,

según sé, esto

query = “%19%”, “%19%”, “%19%”

es una asignación de valores a una variable, ruby permite asignaciones
múltiples del tipo

a, b, c = 10, 20, 30

con lo que obtendríamos a=10, b=20, c=30, por lo tanto cuando haces la
asignación que tu tienes, query es una variable normal, no un array.

debería ser

query << “%19%” << “%19%” << “%19%”

Saludos

Sergio

Sergio L.
escribió:> fields = “id like ? OR name like ? OR created_at like ?”

hola,

query = “%19%”, “%19%”, “%19%”

es una asignación de valores a una variable

ruby tiene algo de “magia” con respecto a cómo se comporta con algunas
cosas según se usen como expresiones “a la izquierda” o “a la derecha”

en este caso concreto, ruby entiende que estás creando un Array y le
asigna el array a query. Es fácilmente comprobable con un

query.class

, ruby permite asignaciones múltiples del tipo

a, b, c = 10, 20, 30

cierto… en este caso ruby al ver que a la izquierda hay una
expresión con varias variables, va asignando una a una

con lo que obtendríamos a=10, b=20, c=30, por lo tanto cuando haces la
asignación que tu tienes, query es una variable normal, no un array.

falso. Como vimos arriba, en el caso de arriba, Ruby ve una sola
variable, con lo que entiende que quieres asignar todos los valores a
una variable. Como eso no es posible, entiende que quieres crear un
array, y es lo que hace. Es como lo de usar una hash directamente sin
necesidad de usar {{, un atajo cómodo

debería ser

query << “%19%” << “%19%” << “%19%”

podría hacerse así, sí… pero no tiene porqué… las dos funcionan y la
primera será un pelín más óptima ya que no tiene que llamar tres veces
al método <<

saludos,

javier ramírez

Antes q nada agradesco su orientacion lo resolvi de la siguiente
forma xD
Recibo del cliente:
“fields”=>"[“id”,“name”,“created_at”]"
“query”=>“X o Y da igual xD”

y hago un arreglo con manejo de expresiones regulares

fields = params[:fields].gsub(/","/," like ? OR “).gsub(/”]/," like ?
“).gsub(/[[|”]/,"")
conditions=params[:fields].gsub(/["\w]/,"").gsub(/[,|]]/,"%#{params[:query]}%?,?").gsub(/[[]/,fields+"?,?").split("?,?")

:conditions =>conditions

ATTE Sergio L.

On Thu, Apr 3, 2008 at 9:50 PM, Sergio L.
[email protected] wrote:

“).gsub(/[[|”]/,“”)
conditions=params[:fields].gsub(/[“\w]/,”“).gsub(/[,|]]/,”%#{params[:query]}%?,?“).gsub(/[[]/,fields+”?,?“).split(”?,?")

:conditions =>conditions

ATTE Sergio L.

Y si el cliente pasa en params[:fields] algo como…

“; select id, CONCAT(username,”=>“,password) as name, created_at from
users #”

Ten cuidado con lo que estás haciendo, por que parece muy sensible a
ataques de inyección mysql.

Un Saludo

si claro todo esta pensado, pero gracias por mencionarlo(y el buen
ejemplo xD), estoy validando en mi programa con otro gsub q no entren ni
comillas,comoas,punto y entro otros caracteres de peligro o conjunto de
ellos…

On Apr 3, 2008, at 21:50 , Sergio L. wrote:

conditions=params[:fields].gsub(/["\w]/,"").gsub(/[,|
]]/,"%#{params[:query]}%?,?").gsub(/[[]/,fields+"?,?").split("?,?")

:conditions =>conditions

Hola Sergio.

Es eso un buscador? El input y su proceso estan un poco sospechoso asi
a bote pronto. Puedes explicar un poco por que recibes una cadena asi
y que has de hacer con ella?

– fxn