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
search
sanean esas cuerdas??
in the where se encargará de la desinfección%
y_
dentrosearch
no serán desinfectadas, bajo este enfoque.En lugar de usar la
conditions
sintaxis de Rails 2, use elwhere
mé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
ILIKE
para 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_string
variable. ¿Creo que laSELECT 1 AS one
salida 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