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.