2011-01-15 11 views
25

कहें कि 3 मॉडल हैं: ए, बी, और सी। इनमें से प्रत्येक मॉडल में x विशेषता है।रेल: क्या मॉड्यूल में नामित दायरे को परिभाषित करना संभव है?

क्या मॉड्यूल में नामित गुंजाइश को परिभाषित करना संभव है और इस मॉड्यूल को ए, बी, और सी में शामिल करना संभव है?

मैं ऐसा करने की कोशिश की और कह रही है कि scope मान्यता प्राप्त नहीं है एक त्रुटि संदेश मिला ...

उत्तर

44

हाँ, यह

module Foo 
    def self.included(base) 
    base.class_eval do 
     scope :your_scope, lambda {} 
    end 
    end 
end 
+0

क्या सत्यापन और संबंध इस तरह से परिभाषित किए जा सकते हैं? – CantGetANick

+0

100% नहीं कह सकता है, लेकिन मुझे नहीं लगता कि क्यों नहीं। –

+0

याप, और यह काम करता है। उदाहरण के लिए धन्यवाद। – CantGetANick

29

रेल 3.1 वाक्य रचना ActiveSupport द्वारा एक छोटे से सरल है के रूप में है: : चिंता:

अब आप कर सकते हैं

require 'active_support/concern' 

module M 
    extend ActiveSupport::Concern 

    included do 
    scope :disabled, where(:disabled => true) 
    end 

    module ClassMethods 
    ... 
    end 
end 

ActiveSupport :: चिंता भी शामिल मॉड्यूल के निर्भरता में स्वीप, here is the documentation

[अद्यतन, को संबोधित aceofbassgreg की टिप्पणी]

रेल 3.1 और बाद ActiveSupport :: चिंता सीधे शामिल होने के लिए एक मॉड्यूल के उदाहरण तरीकों में शामिल की अनुमति देता है , ताकि शामिल मॉड्यूल के अंदर एक InstanceMethods मॉड्यूल बनाना आवश्यक नहीं है। इसके अलावा रेल 3.1 में और बाद में एम :: इंस्टेंस मोड्स को शामिल करने और एम :: क्लासमेड्स का विस्तार करने के लिए अब आवश्यक नहीं है।

require 'active_support/concern' 
module M 
    extend ActiveSupport::Concern 
    # foo will be an instance method when M is "include"'d in another class 
    def foo 
    "bar" 
    end 

    module ClassMethods 
    # the baz method will be included as a class method on any class that "include"s M 
    def baz 
     "qux" 
    end 
    end 

end 

class Test 
    # this is all that is required! It's a beautiful thing! 
    include M 
end 

Test.new.foo # ->"bar" 
Test.baz # -> "qux" 
+0

डॉक्यूमेंटेशन के लिंक के लिए धन्यवाद –

+0

स्पष्टीकरण का बिंदु: यदि, आपके मॉडल में, आप 'एम :: क्लासमेड्स' का विस्तार करते हैं और 'एम :: इंस्टेंस मैथ्यू' शामिल करते हैं, तो आप 'सक्रिय समर्थन समर्थन :: चिंता' तर्क जोड़ना चाहेंगे 'एम :: InstanceMethods' मॉड्यूल में। शायद इस मामले में लेस मॉडल में 'एम' समेत है (और इसमें 'एम :: इंस्टेंस मोड' मॉड्यूल नहीं है?)। – aceofbassgreg

-1

रेल 4.x के लिए के रूप में आप मणि scopes_rails

उपयोग कर सकते हैं यह scopes फ़ाइल पैदा करते हैं और यह अपने मॉडल में शामिल कर सकते हैं: तो हम इस तरह सरल कोड हो सकता है।

इसके अलावा, यह स्वचालित रूप से state_machines राज्यों के लिए स्कॉप्स उत्पन्न कर सकता है।

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