Quiero hacer algo como:
SELECT * FROM USER WHERE NAME LIKE '%Smith%';
Mi intento en Arel:
# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql
Sin embargo, esto se convierte en:
SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';
Arel envuelve correctamente la cadena de consulta 'Smith', pero debido a que es una declaración LIKE, no funciona.
¿Cómo se hace una consulta LIKE en Arel?
PS Bonus: en realidad estoy tratando de escanear dos campos en la tabla, tanto el nombre como la descripción, para ver si hay coincidencias con la consulta. ¿Cómo funcionaría eso?
ruby-on-rails
activerecord
arel
filsa
fuente
fuente
Respuestas:
Así es como se realiza una consulta similar en arel:
PD:
fuente
where("name like ?", ...)
, este enfoque es más portátil en diferentes bases de datos. Por ejemplo, resultaría enILIKE
ser utilizado en una consulta contra una base de datos de Postgres.User.where(users[:name].matches("%#{params[:user_name]}%"))
intentéTRUNCATE users;
y otras consultas similares y no sucedió nada en el lado de sql. Me parece seguro..gsub(/[%_]/, '\\\\\0')
para escapar de los caracteres comodín de MySql.Tratar
PD.
Y ha pasado mucho tiempo, pero @ cgg5207 agregó una modificación (principalmente útil si va a buscar parámetros de nombre largo o múltiples con nombre largo o si es demasiado vago para escribir)
o
fuente
%
en la cadena sustituida? Parece que si solo quisiera un comodín de un solo lado, no hay nada que impida que el usuario envíe un valor de consulta que incluya%
en ambos extremos (sé que en la práctica, Rails evita%
que aparezca en una cadena de consulta, pero parece que hay debe ser protección contra esto en el nivel ActiveRecord).to_sql
o arel manager, ¿cómo ejecutar el sql en db?La respuesta de Reuben Mallaby se puede acortar aún más para usar enlaces de parámetros:
fuente