sql >> Base de Datos >  >> RDS >> PostgreSQL

rieles dinámicos donde consulta sql

Su enfoque está un poco fuera de lugar ya que está tratando de resolver el problema equivocado. Está tratando de crear una cadena para entregar a ActiveRecord para que pueda generar una consulta cuando simplemente debería intentar generar una consulta.

Cuando dices algo como:

Model.where('a and b')

eso es lo mismo que decir:

Model.where('a').where('b')

y puedes decir:

Model.where('c like ?', pattern)

en lugar de:

Model.where("c like '#{pattern}'")

Combinando esas dos ideas con tu self.instance_values podría obtener algo como:

def query
  self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
    q.where("#{name} like ?", "%#{value}%")
  end
end

o incluso:

def query
  empties      = ->(_, v) { v.blank? }
  add_to_query = ->(q, (n, v)) { q.where("#{n} like ?", "%#{v}%") }
  instance_values.reject(&empties)
                 .inject(YourModel, &add_to_query)
end

Asumen que ha incluido correctamente en la lista blanca todas sus variables de instancia. Si no lo has hecho, entonces deberías.