2012-03-17 15 views
5

द्वारा क्वैरी मैं इस तरह एक मॉडल है:रेल + MongoID विशेषता

class Lesson 
    include Mongoid::Document 

    field :title, :type => String 
    field :category, :type => String 
    field :price, :type => Float 
    field :description, :type => String 
    field :user_id, :type => String 


    validates_presence_of :title 
    validates_presence_of :category 
    validates_presence_of :price 
    validates_presence_of :user_id 

    attr_accessible :title, :category, :description, :price 

end 

और मैं इस तरह क्वेरी करने के लिए कोशिश कर रहा हूँ:

@lessons_by_user = Lesson.find_by_user_id current_user.id 

और मैं हो रही है:

पाठ के लिए

अपरिभाषित विधि `find_by_user_id ': कक्षा

मैं MongoID में एक विशिष्ट विशेषता से कैसे पूछ सकता हूं?

मुझे पता है कि इस तरह से यह करने के लिए:

@lessons = Lesson.all(:conditions=>{:user_id=>current_user.id.to_s}) 

लेकिन अगर वहाँ एक शॉर्टकट है मैं सोच रहा हूँ ...

उत्तर

9

Mongoid ActiveRecord शैली स्वतः निर्मित खोजक विधियां नहीं हैं,

  • Model.all
  • Model.count: यह केवल predefined finder methods के एक सीमित सेट का समर्थन करता है
  • Model.exists?
  • Model.find
  • Model.find_or_create_by
  • Model.find_or_initialize_by
  • Model.first
  • Model.last

हालांकि, यह एक सामान्य प्रयोजन where method है तो आप यह कहते हैं:

@lessons = Lesson.where(:user_id => current_user.id) 

where (ActiveRecord के नए संस्करण में where जैसे) के रूप में अच्छी तरह से chainable ताकि आप अधिक शर्तें जोड़ने या अधिक मापदंड कॉल चेनिंग द्वारा आदेश निर्दिष्ट कर सकते हैं।

+0

बहुत बढ़िया। जानना वास्तव में अच्छा है। –

3

Mongoid के संस्करण 3.0.0 के बाद से, आप भी कर सकते हैं:

@lessons = Lesson.find_by(user_id: current_user.id) 

विपरीत where लिए, यह एक Mongoid::Errors::DocumentNotFound अपवाद हैं, जबकि अनुरोध कोई परिणाम देता बढ़ा देंगे। यह डिफ़ॉल्ट व्यवहार है, लेकिन यदि आप raise_not_found_error कॉन्फ़िगरेशन विकल्प false पर सेट करते हैं, तो यह इस मामले में केवल nil लौटाएगा।

स्रोत: http://mongoid.org/en/mongoid/docs/querying.html

+1

उपरोक्त "2 बनाम 3" दस्तावेज़ फिक्स के लिए धन्यवाद। यहां तक ​​कि एआर 'method_missing' में सभी गंदा' find_by_user_id' सामानों के बजाय 'find_by' की तरफ बढ़ रहा है। –