मेरे पास एक Reservation
मॉडल है जिसे मैं तीन क्षेत्रों के साथ खोज रहा हूं। container_id
हमेशा self.id
होना चाहिए लेकिन confirmed
और auto_confirmed
के रूप में केवल एक ही सत्य होना चाहिए। मेरे पास निम्नलिखित है लेकिन यह वह नहीं करता जो मुझे चाहिए:
Reservation.find(:all,
:conditions => ['container_id = ? AND confirmed = ? OR auto_confirm = ?',
self.id, true, true,])
मुझे इसे कैसे बदलना चाहिए?
5 जवाब
मुझे यकीन नहीं है कि मुझे आपकी समस्या मिल रही है, लेकिन जो मैं समझता हूं उससे यह काम करेगा:
Reservation.find(:all,
:conditions => ['container_id = ? AND (confirmed = ? OR auto_confirm = ?)',
self.id, true, true,])
आपके प्रश्न की पुष्टि और 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}]
)
मुझे यकीन नहीं है कि यह डेटाबेस अज्ञेयवादी है, लेकिन आप कोशिश कर सकते हैं
Reservation.find(:all,
:conditions => ['container_id = ? AND confirmed = ? **XOR** auto_confirm = ?',
self.id, true, true,])
आप जो कह रहे हैं वह सच नहीं है - एक प्रश्न जैसे
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]
)
हालाँकि, आपके क्षेत्रों के नामों को देखते हुए आप वास्तव में अलग-अलग स्तंभों के साथ एक राज्य मशीन को लागू कर रहे हैं जो आपको दर्द देगा, इसलिए मैं कुछ ऐसी जांच करूंगा जो आपको अलग-अलग बिट्स की जांच करने के बजाय राज्यों की प्रगति प्रदान करेगी।
मुझे कुछ ऐसा लगता है:
Reservation.find(:all,
:conditions => ['container_id = ? AND ((confirmed != true AND auto_confirm = true) OR (confirmed = true AND auto_confirm != true))',
self.id])
संबंधित सवाल
नए सवाल
mysql
MySQL एक फ्री, ओपन सोर्स रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है जो स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL) का उपयोग करता है। इस टैग को अन्य DBs जैसे SQL Server, SQLite आदि के लिए उपयोग न करें। वे विभिन्न DB हैं जो सभी डेटा का प्रबंधन करने के लिए SQL की अपनी बोलियों का उपयोग करते हैं।