ruby on rails - सक्रिय रिकॉर्ड आधार में कुछ विधि जोड़ने का पसंदीदा तरीका क्या है?




ruby-on-rails include (2)

मैं एक मॉड्यूल बनाना चाहता हूँ जो सक्रिय वर्गों से सक्रिय होने वाले वर्गों को कुछ सामान्य विधियां प्रदान करता है।

निम्नलिखित हम इसे प्राप्त कर सकते हैं दो तरह से है।

1)

module Commentable

def self.extended(base)
    base.class_eval do
        include InstanceMethods
        extend ClassMethods
    end
end

module ClassMethods
    def test_commentable_classmethod
        puts 'test class method'
    end
end

module InstanceMethods
    def test_commentable_instance_method
        puts 'test instance method'
    end
end
end


ActiveRecord::Base.extend(Commentable)

2)

module Commentable

def self.included(base)
    base.extend(ClassMethods)
end

module ClassMethods
    def test_commentable_classmethod
        puts 'test class method'
    end
end

def test_commentable_instance_method
    puts 'test instance methods'
end
end

ActiveRecord::Base.send(:include, Commentable)

यह संभाल करने का पसंदीदा तरीका कौन सा है?

तथा

इसका उपयोग कब करना है?


मोरी के जवाब के साथ फिर से चर्चा करते हुए ... आप ऐसा कुछ कर सकते हैं: -

Module ActiveRecordUtilities

class MyBase < ActiveRecord::Base
  self.abstract_class = true

  def self.a_class_method
  end

  def an_instance_method
  end
end


end##class ends
end##module ends

और इसका इस्तेमाल कर सकते हैं ... मान लें user.rb में

include ActiveRecordUtilities::MyBase 



User.a_class_method
@user.instance_method

============================ या ====================

module MyUtils
  def do_something_funky
    # Some exciting code
  end
end

class Account < ActiveRecord::Base
  belongs_to :person, :extend => MyUtils
end
And then call it like this:

@account = Account.first
@account.person.do_something_funky

एक अन्य तरीका ActiveRecord::Base से ActiveRecord::Base से अपना खुद का बेस क्लास बना सकता है और उसके बाद अपने मॉडल को उस बेस क्लास से उत्तीर्ण किया जाता है। इसने यह स्पष्ट करने का फायदा उठाया है कि आपके मॉडल वेनिला एक्टिवक्रैक पर नहीं चल रहे हैं:

class MyBase < ActiveRecord::Base
  self.abstract_class = true

  def self.a_class_method
  end

  def an_instance_method
  end
end

class Foo < MyBase
end

Foo.a_class_method
Foo.new.an_instance_method




extend