Sua abordagem está um pouco errada, pois você está tentando resolver o problema errado. Você está tentando construir uma string para entregar ao ActiveRecord para que ele possa construir uma consulta quando você deveria simplesmente tentar construir uma consulta.
Quando você diz algo como:
Model.where('a and b')
é o mesmo que dizer:
Model.where('a').where('b')
e você pode dizer:
Model.where('c like ?', pattern)
ao invés de:
Model.where("c like '#{pattern}'")
Combinando essas duas ideias com seus
self.instance_values
você poderia obter algo como:def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
ou ainda:
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
Eles assumem que você colocou corretamente todas as suas variáveis de instância na lista de permissões. Se você não tiver, então você deve.