Váš přístup je trochu mimo, když se snažíte vyřešit špatný problém. Pokoušíte se vytvořit řetězec pro ActiveRecord, aby mohl vytvořit dotaz, když byste se měli jednoduše pokoušet sestavit dotaz.
Když řeknete něco jako:
Model.where('a and b')
to je stejné jako říct:
Model.where('a').where('b')
a můžete říct:
Model.where('c like ?', pattern)
místo:
Model.where("c like '#{pattern}'")
Zkombinujte tyto dva nápady s vašimi self.instance_values
můžete získat něco jako:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
nebo dokonce:
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
Ty předpokládají, že jste správně přidali všechny proměnné instance. Pokud ne, měli byste.