Cách tiếp cận của bạn hơi sai khi bạn đang cố gắng giải quyết vấn đề sai. Bạn đang cố gắng tạo một chuỗi để giao cho ActiveRecord để nó có thể tạo một truy vấn khi bạn chỉ cần cố gắng tạo một truy vấn.
Khi bạn nói điều gì đó như:
Model.where('a and b')
điều đó cũng giống như nói:
Model.where('a').where('b')
và bạn có thể nói:
Model.where('c like ?', pattern)
thay vì:
Model.where("c like '#{pattern}'")
Kết hợp hai ý tưởng đó với self.instance_values
của bạn bạn có thể nhận được một cái gì đó như:
def query
self.instance_values.select { |_, v| v.present? }.inject(YourModel) do |q, (name, value)|
q.where("#{name} like ?", "%#{value}%")
end
end
hoặc thậm chí:
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
Những điều đó giả định rằng bạn đã đưa tất cả các biến phiên bản của mình vào danh sách cho phép một cách chính xác. Nếu bạn chưa có thì bạn nên làm.