Подходът ви е малко неправилен, тъй като се опитвате да разрешите грешния проблем. Опитвате се да изградите низ, който да предадете на ActiveRecord, така че той да може да изгради заявка, когато вие просто трябва да се опитвате да изградите заявка.
Когато кажете нещо като:
Model.where('a and b')
това е същото като да кажете:
Model.where('a').where('b')
и можете да кажете:
Model.where('c like ?', pattern)
вместо:
Model.where("c like '#{pattern}'")
Комбинирането на тези две идеи с вашите self.instance_values
можете да получите нещо като:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
или дори:
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
Те предполагат, че правилно сте поставили в белия списък всичките си променливи на екземпляра. Ако не сте, тогава трябва.