आपका दृष्टिकोण थोड़ा हटकर है क्योंकि आप गलत समस्या को हल करने का प्रयास कर रहे हैं। आप ActiveRecord को सौंपने के लिए एक स्ट्रिंग बनाने का प्रयास कर रहे हैं ताकि यह एक क्वेरी बना सके जब आपको केवल एक क्वेरी बनाने का प्रयास करना चाहिए।
जब आप ऐसा कुछ कहते हैं:
Model.where('a and b')
यह कहने जैसा ही है:
Model.where('a').where('b')
और आप कह सकते हैं:
Model.where('c like ?', pattern)
इसके बजाय:
Model.where("c like '#{pattern}'")
उन दो विचारों को अपने 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
वे मानते हैं कि आपने अपने सभी इंस्टेंस चर को ठीक से श्वेतसूची में डाल दिया है। यदि आपने नहीं किया है तो आपको करना चाहिए।