2012-07-29 6 views
7

वर्तमान में सहेजने पर मैं यह देखने की कोशिश कर रहा हूं कि रिकॉर्ड एक विशेष 'स्कोप' में आता है या नहीं। यह 'स्कोप' वास्तव में कुछ कहां के लिए कुछ सहेजे गए तर्क हैं। इसके अलावा 'स्कोप' के साथ मैं केवल ऑब्जेक्ट के मानों की जांच कर रहा हूं, यह डेटाबेस में अन्य ऑब्जेक्ट्स से संबंधित नहीं है, इसलिए डेटाबेस को पूछताछ हमेशा खत्म हो जाएगी यदि यह समझ में आता है।यह देखने के लिए जांचें कि क्या एक विशेष सक्रिय रिकॉर्ड ऑब्जेक्ट एक विशेष 'स्कोप' में है

मैं केवल नीचे समाधान

begin 
    result = self.class.where(scope).find(self.id) 
rescue 
    result = false 
end 

इस के साथ इस मुद्दे मैं डेटाबेस भले ही मैं पहले से ही रिकॉर्ड है क्वेरी करने के लिए है कि है साथ आने के लिए सक्षम किया गया है, और मैं यह नहीं चलाने के लिए है केवल सहेजने से पहले, लेकिन मूल्यों की जांच करने के लिए सहेजने के बाद और यह मूल्य सहेजने के बाद होगा, क्योंकि अद्यतन संस्करण के लिए डेटाबेस से पूछताछ करने का कोई तरीका नहीं है अगर इसे सहेजा नहीं गया है।

इनमें से कई चेक हो सकते हैं, इसलिए मैं इसे दो बार करने से बचाना चाहता हूं, और कई बार डेटाबेस से पूछताछ करना भी चाहूंगा, भले ही आखिरकार मैं आईडी द्वारा कुछ देख रहा हूं।

एकमात्र अन्य समाधान जो मैं सोचने में सक्षम हूं, यह एक तरीका होगा कि कुछ ऑब्जेक्ट पास करते समय एक बूलियन लौटने वाली प्रो में कॉल कहां से अनुवाद करें। इसका एकमात्र मुद्दा अनुवाद कर रहा है, यह कुछ सक्रिय रिकॉर्ड एडेप्टर के साथ काम करने के लिए कैसे काम करेगा, जो कि पूरी परियोजना की तरह दिखता है। तो क्या कोई ऐसा करने के लिए किसी तरीके से जानता है, या एक मणि जो मदद करेगा?

पीएस मुझे कैश से 'स्कोप' मिल रहा है, इसलिए मैं इसे एक प्रो के रूप में सहेज नहीं सकता क्योंकि आप रेल के साथ कैश में प्रो नहीं डाल सकते हैं।

+1

आपके द्वारा सहेजे जा रहे रिकॉर्ड का एक ठोस उदाहरण प्रदान करना सहायक हो सकता है, जो दायरे की स्थितियों की तरह दिखता है, और आप ऐसा करने का प्रयास क्यों कर रहे हैं। जो कुछ भी आप करने की कोशिश कर रहे हैं उसके बारे में जाने के लिए एक बेहतर तरीका हो सकता है। – deefour

+0

रिकॉर्ड कुछ भी हो सकता है और इसलिए जब तक डेटाबेस में किसी और चीज की तुलना की आवश्यकता नहीं होती है, तब तक इसे फिर से लागू किया जा सकता है, इसे सेट अप करने के लिए कोई फर्क नहीं पड़ता। हालांकि यह एक कैशिंग प्रणाली के लिए है। तो मूल रूप से अगर सहेजने से पहले या बाद में रिकॉर्ड कैश के 'स्कोप' में आता है तो कैश हटा दिया जाता है। यह वास्तव में जटिल पृष्ठों के लिए है जिन्हें आप कैश करना चाहते हैं, लेकिन जब तक अद्यतन रिकॉर्ड संभवतः कैश का हिस्सा न हो, तब तक समाप्त नहीं होना चाहते हैं। – rovermicrover

+0

यहां एक ही प्रश्न है: http://stackoverflow.com/questions/1255815/check-if-model-instance-falls-within-named-scope-in-rails – voondo

उत्तर

5

पहले आप अपनी पहली समाधान एक सा

result = self.class.where(scope).exists?(self.id) 

यदि आप डेटाबेस की जांच नहीं करना चाहती सुधार कर सकते हैं, तो आप सिर्फ क्यों की जांच नहीं करता है, तो अपने ऑब्जेक्ट की विशेषताओं दायरे से मान हैं करते हैं? अगर अपने दायरे

class.where(:attr1 => value1, :attr2 => value2, :attr3 => value3) 

है तो आप क्या कर सकते हैं

result = self.attr1 == value1 and self.attr2 == value2 and self.attr3 == value3 
+0

पहला भाग बहुत मदद करता है, मुझे नहीं पता क्यों मैंने इसके बारे में सोचा नहीं, मेरे सिर को दूर तक पहुंचा! दूसरी बात यह है कि मैं कहां हैश रॉकेट सेट अप कहां प्रतिबंधित करना चाहता हूं। उदाहरण के लिए, एक परियोजना पर मैं दायरा कर रहा हूं कि यदि प्रविष्टि दो तिथियों के बीच प्रकाशित हुई थी, और उसके साथ मैं जो कुछ दिया गया था उसे पार करने के लिए समाप्त होता। हालांकि वास्तव में मुझे सही दिशा में सोचने में मदद करने में मदद करता है! धन्यवाद! – rovermicrover

3

अपने कार्यक्षेत्रों सरल हैं, तो आप शायद कोड दोहराव से बचने के लिए चाहते हैं। मेरा समाधान आपको model.active? पर कॉल करने की अनुमति देता है ताकि यह पता चल सके कि कोई उदाहरण दायरे से मेल खाता है और Model.active दायरे से मेल खाने वाले सभी रिकॉर्ड ढूंढने के लिए है। model.active? में कोई डेटाबेस प्रश्न नहीं है।

config/initializers/scope_and_method.rb को यह जोड़ने पर विचार करें:

require 'active_record/named_scope' 

module ActiveRecord::NamedScope::ClassMethods 
    def scope_and_method field, *values 
    field = field.to_sym 
    values.each do |value| 
     named_scope value.to_sym, :conditions => {field => value} 
     define_method "#{value}?" do 
     send(field.to_sym) == value 
     end 
    end 
    end 
end 

उपयोग:

scope_and_method :state, 'active', 'inactive' 

वर्क्स के रूप में अगर यह था:

named_scope :active, :conditions => {:state => 'active'} 
named_scope :inactive, :conditions => {:state => 'inactive'} 

def active? 
    state == 'active' 
end 

def inactive? 
    state == 'inactive' 
end 

इस रेल 2.3 के लिए एक समाधान है। रेल 3 और 4 (named_scope ->scope) के लिए इसे बहुत ही कम ट्यूनिंग की आवश्यकता है) मैं इसे जल्द ही देखूंगा।

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