I see a lot of stuff
include ActiveRecord::XXXX::InstanceMethods
extend ActiveRecord::XXXX::SingletonMethods
I am unaware of the property or there working, just wanted a easy to understand answer. if it has a good reason to be used.
I see a lot of stuff
include ActiveRecord::XXXX::InstanceMethods
extend ActiveRecord::XXXX::SingletonMethods
I am unaware of the property or there working, just wanted a easy to understand answer. if it has a good reason to be used.
Instance methods are methods you define within a class that are sent to INSTANCES of that class. Singletom or class methods are methods defined within a class that are sent to the CLASS object. As a simple example:
Class A
def instance_method
puts "Hi, I'm an instance method"
end
def self.singleton_method
puts "Hi, I'm a singleton method"
end
end
you call them like this:
singleton:
A.singleton_method
instance_method:
a = A.new
a.instance_method
It's a not-written convention usually adopted when you want to encapsulate features/extensions in a Ruby module intended to be used as a Mixin.
module Bar
def beta
puts "I'm beta"
end
end
class Foo
include Bar
def alpha
puts "I'm alpha"
end
end
Foo.new.beta
# => "I'm beta"
Sometimes the Mixin is a simple as providing some instance methods, sometimes else you need to extend the original class with both instance and class methods. The following syntax in Ruby is invalid.
module Bar
def beta
puts "I'm beta"
end
def self.class_beta
puts "I'm class-beta"
end
end
class Foo
include Bar
def alpha
puts "I'm alpha"
end
end
Foo.new.beta
# => "I'm beta"
Foo.class_beta
# => invalid
That said, you can't include a module with method defined with self
.
For this reason, it's a common pratice to split the module in two submodules and use the self.included
hook.
module Bar
def self.included(base)
base.extend ClassMethod
base.send :include, InstanceMethods
end
module ClassMethods
def class_beta
puts "I'm class-beta"
end
end
module InstanceMethods
def beta
puts "I'm beta"
end
end
end
class Foo
include Bar
def alpha
puts "I'm alpha"
end
end
Foo.new.beta
# => "I'm beta"
Foo.class_beta
# => "I'm class beta"
Also, check out this great article written by Yehuda Katz.