2011-09-28 13 views
7

मैं सीधे रूप में आगे इस तरह के कुछ करने के लिए कोशिश कर रहा हूँ:Mongoid "मानदंड" कैसे काम करता है?

User.all(:criteria => {:project_id => 2}) 

यह Mongoid::Criteria

मैं इस मापदंड के साथ क्या कर सकते हैं की एक आवृत्ति देता है? क्या होगा अगर मैं सिर्फ आगे के मूल्यांकन के लिए दस्तावेजों की सरणी लौटा दूं?

+0

तो 'ActiveRecord में all' एक सरणी देता है का उपयोग करें। आप सरणी प्राप्त करने के लिए 'execute' को कॉल करना चाहते हैं। 'User.where (project_id: 2) .execute' – Travis

उत्तर

2

CriteriaActiveRecord

में Relation वस्तु की तरह कुछ तुम अगर वहाँ इसे इस तरह

users = User.where(:project_id => 2) 
users.each do |user| 
    puts user.name 
end 
# or 
users.all 

यह [] वापस आ जाएगी उपयोग कर सकते है कोई किसी भी उपयोगकर्ता

users.all.each do |user| 
    puts user.name 
end 
+0

यदि कोई मानदंड उस मानदंड से मेल नहीं खाता है, जब मैं चलाता हूं तो user.name रखता है, मैं वापस 'मानदंड' वापस लेता हूं। क्या इससे बचने के लिए वैसे भी है? – randombits

+1

यदि अब कोई उपयोगकर्ता है 'user.name' रखता है तो कभी भी – fl00r

+1

'user.all' निष्पादित नहीं किया जाएगा। यह एक और मानदंड देता है और आमतौर पर इसकी आवश्यकता नहीं होती है। मानदंडों से सरणी प्राप्त करने के लिए, .to_a का उपयोग करें – tothemario

15

Mongoid में, मानदंड क्वेरी का प्रतिनिधित्व करता है, तत्व नहीं। आप फ़िल्टर, एक दायरा, एक क्वेरी ऑब्जेक्ट के रूप में मानदंड के बारे में सोच सकते हैं।

एक बार आपके पास मानदंड (गुंजाइश) हो जाने के बाद, आप तत्वों को प्राप्त कर सकते हैं, डेटाबेस पर वास्तविक क्वेरी निष्पादित कर सकते हैं, तत्वों पर पुनरावृत्ति करने या एक तत्व लौटने के लिए, उदाहरण के लिए: .first, .last, .to_a, .each, .map, आदि

यह अधिक कुशल है और आपको अन्य सरल लोगों से जटिल "क्वेरी" लिखने की अनुमति देता है।

उदाहरण के लिए, यदि आप अपने वर्ग में कुछ नामित स्कोप बना सकते हैं:

class User 
    include Mongoid::Document 
    field :name, type: String 
    field :age, type: Integer 
    field :admin, type: Boolean 

    scope :admins, where(admin: true) # filter users that are admins 
    scope :with_name, (name)-> { where(name: name) } # filter users with that name 
end 

तो फिर तुम कुछ मानदंड बना सकते हैं वस्तुओं:

admins  = User.admins 
johns  = User.with_name('John') 
admin_johns = User.admins.with_name('John') # composition of criterias, is like doing ANDs 
young  = User.where(:age.lt => 25) # the Mongoid method .where also returns a criteria 

इस बिंदु तक, आप आग नहीं था मोंगो डेटाबेस में कोई प्रश्न, आप बस प्रश्न पूछ रहे थे।

किसी भी समय, आप criterias चेनिंग, आगे भी क्वेरी को परिशोधित करने रख सकते हैं:

young_admins = admins.merge(young) 
old_admins = admins.where(age.gt => 60) 

और अंत में, तत्वों के साथ सरणी मिल:

# Execute the query and an array from the criteria 
User.all.to_a 
User.admins.to_a 
admins.to_a 
young_admins.to_a 

# Execute the query but only return one element 
User.first 
admins.first 
johns.last 

# Execute the query and iterate over the returned elements 
User.each{|user| ... } 
User.admins.each{|admin_user| ... } 
johns.map{|john_user| ... } 

तो, कुछ नामित परिभाषित कक्षा में स्कॉप्स, फिर उन्हें मानदंड बनाने के लिए उपयोग करें, और जब आपको इसकी आवश्यकता हो तो असली क्वेरी करें (आलसी लोडिंग)। मानदंड आपके लिए यह सब संभालते हैं भले ही आपको पता न हो कि आपको इसकी आवश्यकता है।

1

एक Mongoid :: मानदंड से एक सरणी प्राप्त करने के लिए: विधि .to_a