2012-04-08 19 views
8

तो मैं इसरेल में, मोंगोइड का उपयोग करके, मैं सभी मॉडलों को वैध (शून्य नहीं) has_one संदर्भ के साथ कैसे ढूंढूं?

class ModelParent 
    include Mongoid::Document 
    field :name, :type => String 
    has_one :model_child 
end 

class ModelChild 
    include Mongoid::Document 
    field :name, :type => String 
    belongs_to :model_parent 
end 

की तरह एक दो मॉडल मानते हुए की ModelParent रेल कंसोल में mp कहा जाता है मैं एक मौजूदा उदाहरण है है

mc = mp.create_model_child(:name=>"child") 

और फिर

mp.model_child 

यह रिटर्न करना एक मान्य वस्तु

हालांकि अगर मैं इसे खोजता हूं इस:

ModelParent.where(:model_child.ne => nil).length 

यह रिटर्न 0

मैं model_child बनाने की कोशिश की है और फिर इसे बताए, यह भी build_model_child() का उपयोग कर, और प्रत्येक विधि से पता चलता model_child माता-पिता में स्पष्ट रूप से है, नहीं के बराबर के लिए हालांकि क्वेरी (.ne) बच्चों के साथ सभी मॉडलपेरेंट्स को खोजने में विफल रहता है।

मैं क्या गलत कर रहा हूं?

अद्यतन:

मेरे अपने प्रश्न का उत्तर दें।

def self.with_child 
    user_ids = ModelChild.all.only(:model_parent_id).map(&:model_parent_id) 
    return ModelParent.where(:_id.in => user_ids).all 
    end 

उत्तर

8

यह रूप में विदेशी कुंजी काम नहीं कर रहा: model_child.ne => नहीं के बराबर काम नहीं कर रहा है, तथापि ...

मैं इस समस्या कुछ इस तरह कोडिंग द्वारा हल: मैं क्यों अनिश्चित अभी भी कर रहा हूँ रिश्ते के पक्ष में संग्रहीत है। तो, आपके मामले में ModelChild संग्रह में फ़ील्ड model_parent_id होगा और दूसरी तरफ नहीं। मुझे लगता है कि आप पहले से ही है कि लगा था बाहर है, लेकिन यह जिस तरह से तुमने किया था को सुलझाने के बजाय, मैं तुम्हें has_one और belongs_to संघों के आसपास स्विच और उसके बाद का उपयोग सुझाव है:

ModelParent.where(:model_child_id.ne => nil) 
+0

बहुत धन्यवाद, यह एक इलाज करता है! – KDKotU

0

मैं .ne पर भरोसा नहीं होता ऐसे मामलों में, मैंने पाया कि .ne विधि हमेशा अच्छा काम नहीं कर रही है: उदाहरण के लिए "झूठी" नाम की एक स्ट्रिंग डालने का प्रयास करें और इसके साथ खोजने का प्रयास करें।ne ;-)

मुझे पता चला है कि इस तरह के मामलों के लिए सबसे अच्छा तरीका है मज़बूती से उचित मॉडल खोजने के लिए देशी मोंगो $type

ModelParent.where(:model_child_id => { :$type => 7 }) 

में जाना जाता है प्रकार की सूची के नीचे से फिल्टर करने के लिए है, यह ज्यादा पाया अधिक विकृत फ़ील्ड

  • डबल को खोजने के लिए कुशल 1
  • स्ट्रिंग 2
  • ओब अस्वीकृत 3
  • सरणी 4
  • बाइनरी डेटा 5
  • अनिर्धारित (पदावनत) 6
  • वस्तु आईडी 7
  • बूलियन 8
  • दिनांक 9
  • अशक्त 10
  • नियमित अभिव्यक्ति 11
  • जावास्क्रिप्ट 13
  • प्रतीक 14
  • (गुंजाइश के साथ) जावास्क्रिप्ट 15
  • 32-बिट पूर्णांक 16
  • टाइमस्टैम्प 17
  • 64-बिट पूर्णांक 18
  • मिन कुंजी 255
  • मैक्स कुंजी 127
0

मुझे एक और तरीका मिला, लेकिन मुझे नहीं पता कि क्या अधिक कुशल या कम है: आप अस्वीकार विधि का उपयोग कर सकते हैं। उदाहरण के लिए:

ModelParent.all.reject{ |r| r.model_child.nil?} 
संबंधित मुद्दे