ruby-on-rails - arel ruby on rails
¿Cómo hacer una consulta LIKE en Arel and Rails? (3)
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 ajusta la cadena de consulta ''Smith'' correctamente, pero debido a que esta es una declaración LIKE, no funciona.
¿Cómo se hace una consulta LIKE en Arel?
Bono de PS: 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?
Así es como se realiza una consulta similar en arel:
users = User.arel_table
User.where(users[:name].matches("%#{user_name}%"))
PD:
users = User.arel_table
query_string = "%#{params[query]}%"
param_matches_string = ->(param){
users[param].matches(query_string)
}
User.where(param_matches_string.(:name)/
.or(param_matches_string.(:description)))
La respuesta de Reuben Mallaby puede acortarse aún más para usar enlaces de parámetros:
User.where("name like :kw or description like :kw", :kw=>"%#{params[:query]}%").to_sql
Tratar
User.where("name like ?", "%#{params[:query]}%").to_sql
PD.
q = "%#{params[:query]}%"
User.where("name like ? or description like ?", q, q).to_sql
Sí, ha pasado mucho tiempo, pero @ cgg5207 ha agregado una modificación (más útil si vas a buscar parámetros largamente nombrados o múltiples con nombres largos o eres demasiado perezoso para escribir)
q = "%#{params[:query]}%"
User.where("name like :q or description like :q", :q => q).to_sql
o
User.where("name like :q or description like :q", :q => "%#{params[:query]}%").to_sql