Ditt tillvägagångssätt är lite fel eftersom du försöker lösa fel problem. Du försöker bygga en sträng som ska lämnas till ActiveRecord så att den kan skapa en fråga när du helt enkelt skulle försöka bygga en fråga.
När du säger något som:
Model.where('a and b')
det är samma sak som att säga:
Model.where('a').where('b')
och du kan säga:
Model.where('c like ?', pattern)
istället för:
Model.where("c like '#{pattern}'")
Att kombinera dessa två idéer med dina self.instance_values
du kan få något som:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
eller till och med:
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 antar att du har vitlistat alla dina instansvariabler korrekt. Om du inte har gjort det borde du göra det.