2011-04-08 14 views
7

नहीं है, तो मेरे पास दो मॉडल के साथ एक ऐप है। Foo has_one बार, बार संबंधित है foo।रेल: "has_one" रिकॉर्ड खोजें जिसमें

अब, एक फू बनाने के लिए आपको इसके लिए एक बार बनाना होगा, लेकिन ऐसा लगता है कि क्रैक के माध्यम से कुछ फिसल गया है क्योंकि मेरे उत्पादन ऐप में अब मुझे एक फू लगता है जिसे किसी भी तरह बिना बनाया गया है बार, और यह 500 त्रुटि का कारण बनता है।

मैं खोज कर सकते हैं:: Bar.where(:foo=>nil) ठीक

अब, यहाँ समस्या है। लेकिन अनाथ बार एक समस्या नहीं है, और यह मुझे नहीं बताता कि मुझे क्या चाहिए।

मुझे एक फू ढूंढना होगा जहां बार शून्य है। लेकिन डेटाबेस बार्स टेबल में रिश्तों को संग्रहीत करता है, यानी, बार्सटेबल में foo_id है, फूज़टेबल में कुछ भी नहीं है, यह बताने के लिए कि इसमें एक बार गुम है।

जब मैं Foo.find(#).bar का उपयोग करता हूं तो मुझे एक फर्जी रिकॉर्ड के लिए शून्य मिल जाएगा, लेकिन मेरे पास बहुत सारे रिकॉर्ड हैं।

तो, क्या कोई मुझे बता सकता है कि एक प्रश्न कैसे बनाया जाए जो उस फू को वापस कर दे जो उसके बार गुम हो?

धन्यवाद !!

उत्तर

7

मुझे यकीन है कि क्या रूबी कोड होगा नहीं कर रहा हूँ, लेकिन मुझे लगता एसक्यूएल की तरह कुछ किया जाना चाहिए: फू से

चुनें * कहां आईडी नहीं (पट्टी से foo_id का चयन करें) एक और तरीका है

+4

यह काम किया! - रेल में यह सिर्फ 'Foo.where ("आईडी नहीं है (बार से foo_id चुनें)") धन्यवाद! – Andrew

+0

आईएमएचओ, ऐसा करने के लिए सही एआर तरीका है: 'Foo.joins (: bar)', जिसके परिणामस्वरूप 'SELECT \ 'foos \'। * Foos \ 'INNER JOIN \' बार \ 'चालू \' बार \ '। \' Foo_id \ '= \' foos \ '। \' Id \ ''। आप इसे और अनुकूलित कर सकते हैं: 'Foo.includes (: bar) .joins (: bar)' आपको डीबी को कुछ बाद के अनुरोध सहेज सकता है। –

2

(एसक्यूएल का उपयोग किए बिना) कुछ ऐसा करना होगा:

Foo.all.select {| f | ! f.bar}

यह फू ऑब्जेक्ट्स की एक सरणी लौटाएगा जिसमें संबंधित बार ऑब्जेक्ट नहीं है।

इस विधि में, आप विशिष्ट तालिका जानकारी पर निर्भर नहीं हैं। यदि भविष्य में विदेशी_की कॉलम को बदलना था Foo -> बार एसोसिएशन, यह विधि काम करना जारी रखेगी।

+0

अच्छी टिप, धन्यवाद! – Andrew

+0

यह बहुत कम प्रदर्शनकारी होगा, क्योंकि यह एआर ऑब्जेक्ट्स को लाने और तत्काल करने का कारण बनता है। – kranzky

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