जवाबों:
Note.
where(:user_id => current_user.id, :notetype => p[:note_type]).
where("date > ?", p[:date]).
order('date ASC, created_at ASC')
या आप सब कुछ SQL संकेतन में बदल सकते हैं
Note.
where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]).
order('date ASC, created_at ASC')
where()
। where()
स्वचालित रूप से उपयोग करने से इनपुट बच जाता है।
where()
स्वचालित रूप से इनपुट से बच जाता है जब इसका उपयोग चर के स्थान पर प्रश्न-चिह्न के साथ ऊपर दिखाए गए प्रारूप में किया जाता है, बाद में उन्हें फ़ंक्शन कॉल में सूचीबद्ध किया जाता है। इस तरह से इसका इस्तेमाल करना सुरक्षित नहीं है:Note.where("date > #{p[:date]}")
where("user_id = ?",current_user.id)
तुलना where(user_id: current_user.id)
में जोखिम भरा है जहां आप उन मॉडलों को मर्ज करते हैं जिनमें दोनों का user_id
क्षेत्र है। कच्चे एसक्यूएल संकेतन का उपयोग करने का मतलब है कि आपको टेबल स्पष्टीकरण को स्वयं शामिल करने की आवश्यकता है, जैसे where("notes.user_id = ?",current_user.id)
:।
यदि आप उन समस्याओं से टकराते हैं जहाँ स्तंभ नाम अस्पष्ट हैं, तो आप कर सकते हैं:
date_field = Note.arel_table[:date]
Note.where(user_id: current_user.id, notetype: p[:note_type]).
where(date_field.gt(p[:date])).
order(date_field.asc(), Note.arel_table[:created_at].asc())
आप उपयोग करने की कोशिश कर सकते हैं:
where(date: p[:date]..Float::INFINITY)
sql में बराबर
WHERE (`date` >= p[:date])
परिणाम है:
Note.where(user_id: current_user.id, notetype: p[:note_type], date: p[:date]..Float::INFINITY).order(:fecha, :created_at)
और मैं भी बदल गया हूं
order('date ASC, created_at ASC')
के लिये
order(:fecha, :created_at)
नियम 6.1 ने where
शर्तों में तुलना ऑपरेटरों के लिए एक नया 'वाक्यविन्यास' जोड़ा , उदाहरण के लिए:
Post.where('id >': 9)
Post.where('id >=': 9)
Post.where('id <': 3)
Post.where('id <=': 3)
तो आपकी क्वेरी को इस प्रकार फिर से लिखा जा सकता है:
Note
.where(user_id: current_user.id, notetype: p[:note_type], 'date >', p[:date])
.order(date: :asc, created_at: :asc)
यहां पीआर के लिए एक लिंक है जहां आप अधिक उदाहरण पा सकते हैं।