sql queries - Rails 4 LIKE query-ActiveRecord agrega comillas




where ruby (6)

Estoy tratando de hacer una consulta similar como tal

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, se agregan comillas, lo que hace que la sentencia sql salga como

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, ambos de los cuales nunca he usado, así que no estoy seguro de si es algo de activerecord o posiblemente algo de postgres.

¿Cómo puedo configurar esto para que tenga como '%my_search%' en la consulta final?


Answers

Tu marcador de posición se reemplaza por una cadena y no lo estás manejando bien.

Reemplazar

"name LIKE '%?%' OR postal_code LIKE '%?%'", search, search

con

"name LIKE ? OR postal_code LIKE ?", "%#{search}%", "%#{search}%"

.find(:all, where: "value LIKE product_%", params: { limit: 20, page: 1 })

En lugar de usar la sintaxis de conditions de Rails 2, use Rails 4's where method en su lugar:

def self.search(search, page = 1 )
  wildcard_search = "%#{search}%"

  where("name ILIKE :search OR postal_code LIKE :search", search: wildcard_search)
    .page(page)
    .per_page(5)
end

NOTA: lo anterior usa sintaxis de parámetro en lugar de? marcador de posición: ambos deberían generar el mismo sql.

def self.search(search, page = 1 )
  wildcard_search = "%#{search}%"

  where("name ILIKE ? OR postal_code LIKE ?", wildcard_search, wildcard_search)
    .page(page)
    .per_page(5)
end

NOTA: utilizando ILIKE para el nombre - postgres insensible a mayúsculas / minúsculas, versión de LIKE


ActiveRecord es lo suficientemente inteligente como para saber que el parámetro al que hace referencia el ? es una cadena, por lo que la encierra en comillas simples. Podrías , como una publicación, sugerir el uso de la interpolación de cadenas de Ruby para rellenar la cadena con los símbolos % requeridos. Sin embargo, esto podría exponerte a una inyección SQL (que es mala). Sugeriría que use la función SQL CONCAT() para preparar la cadena de esta manera:

"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)


Tratar

 def self.search(search, page = 1 )
    paginate :per_page => 5, :page => page,
      :conditions => ["name LIKE  ? OR postal_code like ?", "%#{search}%","%#{search}%"],   order => 'name'
  end

Consulte los docs en condiciones AREL para obtener más información.


En SQL Server 2008 puede insertar varias filas utilizando una sola instrucción SQL INSERT.

INSERT INTO MyTable ( Column1, Column2 ) VALUES
( Value1, Value2 ), ( Value1, Value2 )

Para obtener referencia a esto, consulte el Curso 2778A de MOC - Escribir consultas SQL en SQL Server 2008.

Por ejemplo:

INSERT INTO MyTable ( Column1, Column2, Column3 )
VALUES ('John', 123, 'Lloyds Office'), 
('Jane', 124, 'Lloyds Office'), 
('Billy', 125, 'London Office'),
('Miranda', 126, 'Bristol Office');




sql ruby-on-rails ruby postgresql activerecord