Twoje podejście jest trochę nietrafione, ponieważ próbujesz rozwiązać niewłaściwy problem. Próbujesz zbudować ciąg do przekazania do ActiveRecord, aby mógł zbudować zapytanie, podczas gdy powinieneś po prostu próbować zbudować zapytanie.
Gdy powiesz coś takiego:
Model.where('a and b')
to to samo, co powiedzenie:
Model.where('a').where('b')
i możesz powiedzieć:
Model.where('c like ?', pattern)
zamiast:
Model.where("c like '#{pattern}'")
Łącząc te dwa pomysły ze swoimi self.instance_values
możesz dostać coś takiego:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
a nawet:
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
Zakładają one, że poprawnie umieściłeś na białej liście wszystkie zmienne instancji. Jeśli nie, to powinieneś.