Estoy tratando de hacer una consulta similar
def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search], order => 'name'
end
Pero cuando se ejecuta, algo agrega comillas, lo que hace que la instrucción sql salga así
SELECT COUNT(*)
FROM "schools"
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):
Entonces puedes ver mi problema. Estoy usando Rails 4 y Postgres 9, los cuales nunca he usado, así que no estoy seguro de si es una cosa de grabación activa o posiblemente una cosa de postgres.
¿Cómo puedo configurar esto para que me guste '%my_search%'en la consulta final?
sql
ruby-on-rails
ruby
postgresql
activerecord
Harry Forbess
fuente
fuente

searchsanean esas cuerdas??in the where se encargará de la desinfección%y_dentrosearchno serán desinfectadas, bajo este enfoque.En lugar de usar la
conditionssintaxis de Rails 2, use elwheremétodo de Rails 4 :NOTA: lo anterior usa la sintaxis de parámetros en lugar de? marcador de posición: ambos deberían generar el mismo sql.
NOTA: usar
ILIKEpara el nombre - versión postgres insensible a mayúsculas y minúsculas de LIKEfuente
Movie.where("title ILIKE :s", s: search_string)traduceSELECT 1 AS one FROM "movies" WHERE (title ILIKE 'test') LIMIT $1(Rails 5.1.6), tenga en cuenta que no hay un símbolo de porcentaje después del ILIKE)search_stringvariable. ¿Creo que laSELECT 1 AS onesalida es solo en la consola de rails o está usandolimit(1)? FYI: Rails 5.1.6 tiene problemas de seguridad, use 5.1.6.2 o 5.1.7 en su lugarSi bien la interpolación de cadenas funcionará, ya que su pregunta especifica los rieles 4, podría usar Arel para esto y mantener la base de datos de su aplicación independiente.
fuente
ActiveRecord es lo suficientemente inteligente como para saber que el parámetro al que hace referencia
?es una cadena, por lo que lo encierra entre comillas simples. Usted podría como un puesto sugiere el uso de Ruby interpolación de cadenas para rellenar la cadena con los requeridos%símbolos. Sin embargo, esto podría exponerlo a la inyección de SQL (que es malo). Te sugiero que uses laCONCAT()función SQL para preparar la cadena de esta manera:"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)fuente
%se agrega / anexó o no). O funciona como se esperaba o los rieles tienen un error importante que afecta a ambos casos.Tratar
Consulte los documentos sobre las condiciones de AREL para obtener más información.
fuente
fuente