Pendekatan Anda sedikit salah karena Anda mencoba memecahkan masalah yang salah. Anda mencoba membuat string untuk diserahkan ke ActiveRecord sehingga dapat membuat kueri saat Anda seharusnya mencoba membuat kueri.
Saat Anda mengatakan sesuatu seperti:
Model.where('a and b')
itu sama dengan mengatakan:
Model.where('a').where('b')
dan Anda dapat mengatakan:
Model.where('c like ?', pattern)
bukannya:
Model.where("c like '#{pattern}'")
Menggabungkan kedua ide tersebut dengan self.instance_values
Anda Anda bisa mendapatkan sesuatu seperti:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
atau bahkan:
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
Mereka berasumsi bahwa Anda telah memasukkan semua variabel instan ke daftar putih dengan benar. Jika belum maka Anda harus melakukannya.