17

मैं काम करने के लिए काम करने की कोशिश कर रहे रेल कंसोल में चारों ओर खेल रहा हूं, और मैं यह देख रहा हूं कि मेरे प्रश्नों में से एक यह वापस लौटता रहता है जब इसे ' टी। जेनरेट की गई SQL क्वेरी को देखने पर मुझे लगता है कि इसमें प्रत्येक बार AND (1=0) शामिल है। यह बहुत परेशान है, और मुझे यकीन नहीं है कि यह क्यों कर रहा है।ActiveRecord प्रश्नों के अंत में 'AND (1 = 0)' को जोड़ता है

नोट: कार्यशील मणि का उपयोग करना।

कदम पुन: पेश करने:

2.1.2 :xxxx > @parent = Parent.take 
Parent Load (38.1ms) SELECT `parents`.* FROM `parents` LIMIT 1 
=> #<Parent id: 37, ...> 

2.1.2 :xxxx > @child = Child.where(id: @parent.actable_id) 
SQL (0.7ms) SELECT `childs`.`id` AS t0_r0, `childs`.`attribute` AS t0_r1, FROM `childs` 
... 
LEFT OUTER JOIN `parents` ON `parents`.`actable_id` = `childs`.`id` AND `parents`.`actable_type` = 'child type' WHERE `childs`.`id` = 20 AND (1=0) 
=> #<ActiveRecord::Relation []> 

हो रहा क्यों है (रेल कंसोल में तालिकाओं के लिए कनेक्ट करने के बाद)? मैं इसे कैसे रोकूं? जब आप एक स्तंभ जिसका मूल्य एक खाली सरणी में है के लिए क्वेरी

+1

मैं देखा कि रेल इस प्रश्न के लिए ऐसा करता है: 'User.where (: id => []) ', चूंकि आप एसक्यूएल में आईडी() 'में उपयोगकर्ताओं से' चयन * नहीं लिख सकते हैं। तो मुझे लगता है कि यह दृष्टिकोण उन प्रश्नों के लिए होता है जो जानते हैं कि कुछ भी वापस नहीं आएगा, लेकिन यह एसक्यूएल में व्यक्त नहीं हो सकता है। – MaxGabriel

+0

@MaxGabriel यह मेरे लिए जवाब था। शायद इसे सिर्फ एक टिप्पणी के बजाय उत्तर के रूप में रखें? – jgraft

+0

@jgraft अच्छा विचार, मैंने आपको यह उत्तर दिया जैसा आपने सुझाया था। – MaxGabriel

उत्तर

35

रेल AND (1=0) तरह एसक्यूएल उत्पन्न करेगा:

Child.where(id: []) 

Intuitively, आपको लगता है कि SELECT * FROM children WHERE id IN() तरह एसक्यूएल उत्पन्न करने के लिए उम्मीद थी, लेकिन () वास्तव में नहीं है वैध एसक्यूएल। के बाद से कोई भी पंक्ति क्वेरी से मेल खाने होगा, हालांकि, रेल इस के चारों ओर एक बराबर क्वेरी जो भी कोई भी पंक्ति रिटर्न को उत्पन्न करती है:

SELECT * FROM children WHERE 1=0; 
+0

धन्यवाद! इस जवाब ने मुझे एक ही भ्रम के साथ मदद की! बहुत बुरा यह सही जवाब के रूप में कभी स्वीकार नहीं किया गया था। – ChrisDekker

+0

@ alex0112 क्या आप इस उत्तर को स्वीकार करने पर विचार करेंगे? – MaxGabriel

+0

ऐसा लगता है कि यदि आप खाली हैश Child.joins (: पैरेंट) निर्दिष्ट करते हैं। कहीं भी:: माता-पिता => {}) – olivervbk

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