Din tilgang er lidt forkert, da du prøver at løse det forkerte problem. Du forsøger at bygge en streng, der skal afleveres til ActiveRecord, så den kan bygge en forespørgsel, når du blot skulle prøve at bygge en forespørgsel.
Når du siger noget som:
Model.where('a and b')
det er det samme som at sige:
Model.where('a').where('b')
og du kan sige:
Model.where('c like ?', pattern)
i stedet for:
Model.where("c like '#{pattern}'")
At kombinere disse to ideer med dine self.instance_values
du kunne få noget som:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
eller endda:
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
De antager, at du har hvidlistet alle dine instansvariabler korrekt. Hvis du ikke har, så skal du.