如果您在定义的模型中使用了include
d ,则应该能够使用:MyConcern
self.do_something
super
module MyConcern
extend ActiveSupport::Concern
class_methods do
def do_something
puts "I'm do_something in the concern"
end
end
end
class UsesMyConcern < ActiveRecord::Base
include MyConcern
def self.do_something
super
end
end
UsesMyConcern.do_something
# => "I'm do_something in the concern"
如果您没有或不想include MyConcern
在模型中使用,并且想要do_something
在不创建任何中间对象的情况下调用模块,则可以将模型更改为:
class UsesMyConcern < ActiveRecord::Base
def self.do_something
MyConcern::ClassMethods.instance_method(:do_something).bind(self).call
end
end
UsesMyConcern.do_something
# => "I'm do_something in the concern"
ActiveSupport::Concern.class_methods
如果还没有模块,则在关注点中定义一个ClassMethods
模块,这就是我们可以找到该do_something
方法的地方。