मेरे पास एक Reservation मॉडल है जिसे मैं तीन क्षेत्रों के साथ खोज रहा हूं। container_id हमेशा self.id होना चाहिए लेकिन confirmed और auto_confirmed के रूप में केवल एक ही सत्य होना चाहिए। मेरे पास निम्नलिखित है लेकिन यह वह नहीं करता जो मुझे चाहिए:

Reservation.find(:all, 
:conditions => ['container_id = ? AND confirmed = ? OR auto_confirm = ?', 
self.id, true, true,])

मुझे इसे कैसे बदलना चाहिए?

1
thenengah 5 मई 2010, 16:50

5 जवाब

सबसे बढ़िया उत्तर

मुझे यकीन नहीं है कि मुझे आपकी समस्या मिल रही है, लेकिन जो मैं समझता हूं उससे यह काम करेगा:

Reservation.find(:all, 
:conditions => ['container_id = ? AND (confirmed = ? OR auto_confirm = ?)', 
self.id, true, true,])
6
marcgg 5 मई 2010, 16:53
आप पूछते हैं "केवल एक को सच होने की जरूरत है" तार्किक रूप से इसका मतलब है कि दोनों के साथ पंक्ति सत्य नहीं होनी चाहिए। और इसके लिए नीचे मेरा उत्तर देखें।
 – 
Salil
5 मई 2010, 17:03
यदि दोनों सत्य हैं तो यह भी काम करेगा। फिर यह उस तर्क पर निर्भर करता है जो आप चाहते हैं
 – 
marcgg
5 मई 2010, 17:06
केवल एक ही सत्य होना चाहिए अर्थात केवल एक ही सत्य हो सकता है और यदि दोनों सत्य हैं तो काम नहीं करना चाहिए
 – 
thenengah
6 मई 2010, 08:34
केवल एक को सच होने की जरूरत है - मेरे विचार की पटरी से उतरी ट्रेन पर - इसका मतलब है कि दोनों सच हो सकते हैं लेकिन केवल एक को सच होने की जरूरत है
 – 
thenengah
6 मई 2010, 08:57

आपके प्रश्न की पुष्टि और auto_confirmed के अनुसार केवल एक को सत्य होने की आवश्यकता है। तो निम्नलिखित का उपयोग करें

Reservation.find(:all, 
                 :conditions => ['container_id = :container AND 
                  ( (confirmed = :flag and auto_confirm != :flag) ||
                    (confirmed != :flag and auto_confirm = :flag))', 
                    {:container=> self.id, :flag=>true}]
               )
3
Salil 5 मई 2010, 17:05
आपके उत्तर के लिए धन्यवाद लेकिन इसने मेरे द्वारा चेक किए गए काम को उतना आसान नहीं बनाया - और निश्चित रूप से यह इस बात पर निर्भर है कि मैंने इस प्रश्न को कैसे कहा। लेकिन प्लस वन आपके उत्तर के लिए धन्यवाद!
 – 
thenengah
6 मई 2010, 08:36

मुझे यकीन नहीं है कि यह डेटाबेस अज्ञेयवादी है, लेकिन आप कोशिश कर सकते हैं

Reservation.find(:all, 
:conditions => ['container_id = ? AND confirmed = ? **XOR** auto_confirm = ?', 
self.id, true, true,])
0
Tadas T 5 मई 2010, 18:24

आप जो कह रहे हैं वह सच नहीं है - एक प्रश्न जैसे

  SELECT * FROM foos WHERE content_id = 345 AND (confirm = 1 OR auto_confirm = 1)

उन पंक्तियों का चयन करेगा जहां दोनों "पुष्टि करें" कॉलम 1 पर सेट हैं (और ActiveRecord बूलियन के लिए छोटे कॉलम बनाता है और 1 और 0 के खिलाफ जांच करता है)।

यदि आपका मतलब "content_id पर मेल खाने वाली सभी पंक्तियों को ढूंढें और या तो पुष्टि करें या auto_confirmed true लेकिन दोनों नहीं" तो आप इस तरह की एक क्वेरी पर आते हैं

 SELECT * FROM foos WHERE content_id = 345 AND ((confirmed = 1 AND auto_confirm = 0) OR (confirmed = 0 AND auto_confirm = 1))

जिसे आप AR शब्दों में इस तरह से रिवर्ड करते हैं

  Reservation.find(:all, 
    :conditions => [
      'container_id = ? AND ((confirmed = 1 AND auto_confirm != 1) OR (confirmed = 0 AND auto_confirm != 1))', 
      self]
  )

हालाँकि, आपके क्षेत्रों के नामों को देखते हुए आप वास्तव में अलग-अलग स्तंभों के साथ एक राज्य मशीन को लागू कर रहे हैं जो आपको दर्द देगा, इसलिए मैं कुछ ऐसी जांच करूंगा जो आपको अलग-अलग बिट्स की जांच करने के बजाय राज्यों की प्रगति प्रदान करेगी।

0
Julik 5 मई 2010, 19:18

मुझे कुछ ऐसा लगता है:

Reservation.find(:all, 
:conditions => ['container_id = ? AND ((confirmed != true AND auto_confirm = true) OR (confirmed = true AND auto_confirm != true))', 
self.id])
0
dombesz 6 मई 2010, 15:33
यह पुष्टि के साथ काम नहीं करेगा = झूठा और auto_confirm = शून्य उदाहरण के लिए हालांकि।
 – 
Salil
5 मई 2010, 17:22
पुष्टि और auto_confirm के लिए डिफ़ॉल्ट मान हैं :false
 – 
thenengah
6 मई 2010, 08:38