Je aanpak is een beetje verkeerd omdat je het verkeerde probleem probeert op te lossen. U probeert een tekenreeks bij de hand te maken voor ActiveRecord, zodat het een query kan maken terwijl u gewoon zou moeten proberen een query te maken.
Als je iets zegt als:
Model.where('a and b')
dat is hetzelfde als zeggen:
Model.where('a').where('b')
en je kunt zeggen:
Model.where('c like ?', pattern)
in plaats van:
Model.where("c like '#{pattern}'")
Deze twee ideeën combineren met uw self.instance_values
je zou zoiets kunnen krijgen als:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
of zelfs:
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
Die gaan ervan uit dat u al uw instantievariabelen correct op de witte lijst hebt gezet. Als je dat niet hebt gedaan, zou je dat moeten doen.