2010-11-19 12 views
115

मैं रेल 3 में यह खोज की है:क्या आप रेल 3 खोज में किसी दिनांक की तुलना से अधिक कर सकते हैं?

Note.where(:user_id => current_user.id, :notetype => p[:note_type], :date => p[:date]).order('date ASC, created_at ASC') 

लेकिन मैं :date => p[:date] हालत :date > p[:date] को बराबर करने की आवश्यकता है। मैं यह कैसे कर सकता हूँ? पढ़ने के लिए धन्यवाद।

उत्तर

203
Note. 
    where(:user_id => current_user.id, :notetype => p[:note_type]). 
    where("date > ?", p[:date]). 
    order('date ASC, created_at ASC') 

या आप भी एसक्यूएल अंकन

Note. 
    where("user_id = ? AND notetype = ? AND date > ?", current_user.id, p[:note_type], p[:date]). 
    order('date ASC, created_at ASC') 
+2

कि सुरक्षित है? मेरा मतलब है कि पी [तिथि] उपयोगकर्ता इनपुट से आया है, तो क्या यह एक एसक्यूएल इंजेक्शन का कारण बन सकता है? – MhdSyrwan

+7

यह कहां सुरक्षित है क्योंकि 'कहाँ() '। 'जहां() 'स्वचालित रूप से इनपुट से बच निकलता है। –

+25

सिमोन की टिप्पणी पूरी तरह से सच नहीं है; 'जहां() 'स्वचालित रूप से इनपुट से बच निकलता है जब इसे चर के स्थान पर प्रश्न-चिह्न के साथ ऊपर दिखाए गए स्वरूप में उपयोग किया जाता है, साथ ही फ़ंक्शन कॉल में सूचीबद्ध किया जाता है। इसे इस तरह से उपयोग करना सुरक्षित नहीं है: 'नोट। कहीं (" दिनांक> # {पी [: तिथि]} ")' – bdx

58

यदि आप समस्याओं जहां स्तंभ नाम अस्पष्ट हैं हिट में सब कुछ परिवर्तित कर सकते हैं, तो आप कर सकते हैं:

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()) 
+2

करने से पहले पी [दिनांक] को अपने वर्तमान यूटीसी में कनवर्ट करना सुनिश्चित करें, किसी कारण से, मुझे एक पोस्टम्रेएसक्यूएल सर्वर पर सिमोन की "कहां" विधि का उपयोग करके नहीं मिला एक कॉलम के साथ एक त्रुटि हो रही थी लेकिन यह SQLite में काम करता था। आपकी विधि दोनों पर काम किया। – plackemacher

+1

एरियल के लिए यहां कुछ दस्तावेज दिए गए हैं: https://github.com/rails/arel –

संबंधित मुद्दे

 संबंधित मुद्दे