あなたが間違った問題を解決しようとしているので、あなたのアプローチは少しずれています。単にクエリを作成しようとしているときにクエリを作成できるように、ActiveRecordに渡す文字列を作成しようとしています。
あなたが次のようなことを言うとき:
Model.where('a and b')
それは言うことと同じです:
Model.where('a').where('b')
そしてあなたは言うことができます:
Model.where('c like ?', pattern)
代わりに:
Model.where("c like '#{pattern}'")
これら2つのアイデアを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
これらは、すべてのインスタンス変数を適切にホワイトリストに登録したことを前提としています。そうでない場合は、そうする必要があります。