2010-08-11 24 views
15

के बीच साझा विधि यदि मेरे कुछ मॉडल में गोपनीयता कॉलम है, तो क्या मैं एक मॉडल को सभी मॉडलों द्वारा साझा की गई एक विधि लिख सकता हूं, इसे कॉल करें is_public?रेल पर रूबी: मॉडल

तो, मैं object_var.is_public करने में सक्षम होना चाहता हूं?

उत्तर

37

एक संभव तरीका एक module इस (RAILS_ROOT/lib/shared_methods.rb)

module SharedMethods 
    def is_public? 
    # your code 
    end 
end 

तो फिर तुम दो की जरूरत है हर मॉडल में इस मॉड्यूल यह तरीकों (यानी app/models/your_model.rb)

class YourModel < ActiveRecord::Base 
    include SharedMethods 
end 
होना चाहिए कि शामिल की तरह में साझा तरीकों डाल करने के लिए है

अद्यतन:

रेल 4 में एक 012 है ऐसा करने के लिए। आप में app/models/concernslib के बजाय

इसके अलावा आप इस

module SharedMethods 
    extend ActiveSupport::Concern 

    included do 
    scope :public, -> { where(…) } 
    end 

    def is_public? 
    # your code 
    end 

    module ClassMethods 
    def find_all_public 
     where #some condition 
    end 
    end 
end 
+0

के लिए केवल प्यार की वजह से भाग का उपयोग करने के दबाव में न आएँ, लेकिन मैं एक चर कह पारित करने के लिए की आवश्यकता होगी विधि मैं किस वर्ग का उपयोग कर रहा हूं ... – NullVoxPopuli

+1

self.class आपको उस विधि के संदर्भ में कक्षा जो कुछ भी कहता है उसे देगा। तो, उदाहरण के लिए, यदि आपने YourModel.new.is_public किया है, तो self.class आपका मॉडल होगा। – lambdabutz

5

की तरह शामिल किए जाने पर वर्ग विधियां जोड़ें और कोड निष्पादित कर सकते हैं आप भी ऐसा कर सकते हैं इस तरह साझा रखूं कोड एक पूर्वज से मॉडल इनहेरिट द्वारा जो साझा विधियों को शामिल करता है।

class BaseModel < ActiveRecord::Base 
    def is_public? 
    # blah blah 
    end 
end 

class ChildModel < BaseModel 
end 

अभ्यास में, jigfox के दृष्टिकोण अक्सर बेहतर बाहर काम करता है, इसलिए OOP सिद्धांत :)

+0

मैं इसे इस तरह से करना चाहता हूं। लेकिन मैं इसे काम नहीं कर सकता ... :( –

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