2009-08-10 11 views
7

में named_scope के दायरे में आता मान लें मैं एक नामित गुंजाइश है:जांच करें कि मॉडल उदाहरण रेल

class Foo < ActiveRecord::Base 
    named_scope :bar, :conditions => 'some_field = 1' 
end 

इस क्वेरी के लिए महान काम करता है और मैं परिभाषित उपयोगी named_scopes का एक समूह है। मैं यह क्या करना चाहता हूं:

f = Foo.find(:first) 
f.some_field = 1 
f.is_bar? #=> true 

'.bar?' यदि मॉडल उदाहरण नामित दायरे में आता है तो विधि बस सच या गलत हो जाएगी। क्या 'is_bar' लिखने के बिना ऐसा करने के लिए वैसे भी है? विधि, भले ही मैंने कुछ 'is_bar' जांचने के लिए पहले से ही एक अच्छा तरीका लिखा है? अगर मुझे सही याद है, तो DRY अच्छा है इसलिए किसी भी मदद की सराहना की जाएगी/

उत्तर

20

आप नामित स्कोप पर exists? विधि को कॉल कर सकते हैं जो डेटाबेस से पूछताछ करेगा कि यह रिकॉर्ड उन शर्तों के साथ मौजूद है या नहीं।

Foo.bar.exists?(f) 

हालांकि इस अगर आप f पर विशेषताओं को बदल दिया है और डेटाबेस के लिए यह सहेजा नहीं काम नहीं करेगा। ऐसा इसलिए है क्योंकि नामित स्कोप स्थितियां एसक्यूएल हैं इसलिए चेक वहां होना चाहिए। रुबी if स्थितियों में कनवर्ट करने का प्रयास गन्दा है, खासकर अधिक जटिल परिदृश्यों में।

+0

धन्यवाद। ठीक है तो मुझे नाटक करने के लिए कहा जाता है। मूल्य बदलने के बाद बचाओ। Foo.bar.exists? (Foo.find (: पहले)) बार बार के दायरे में पड़ने पर सही या गलत वापस आ जाएगा? बहुत बढ़िया। – user94154

+0

सही। आपको फिर से कॉल करना नहीं चाहिए। "f.save; Foo.bar.exists? (एफ)" काम करना चाहिए। – ryanb

+4

क्या 200 9 से यह आसान हो गया है? –

1

यदि आपके स्कॉप्स सरल हैं, तो आप शायद कोड डुप्लिकेशन से बचना चाहते हैं। मेरा समाधान आपको 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) के लिए इसे बहुत ही कम ट्यूनिंग की आवश्यकता है) मैं इसे जल्द ही देखूंगा।

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