Ihr Ansatz ist ein wenig daneben, da Sie versuchen, das falsche Problem zu lösen. Sie versuchen, eine Zeichenfolge zu erstellen, die ActiveRecord übergeben werden kann, damit es eine Abfrage erstellen kann, wenn Sie einfach nur versuchen sollten, eine Abfrage zu erstellen.
Wenn Sie etwas sagen wie:
Model.where('a and b')
das ist dasselbe wie zu sagen:
Model.where('a').where('b')
und Sie können sagen:
Model.where('c like ?', pattern)
statt:
Model.where("c like '#{pattern}'")
Kombinieren Sie diese beiden Ideen mit Ihren self.instance_values
Sie könnten so etwas bekommen wie:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
oder sogar:
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
Diese setzen voraus, dass Sie alle Ihre Instanzvariablen ordnungsgemäß auf die Whitelist gesetzt haben. Wenn nicht, sollten Sie es tun.