如何覆盖模型关注点中定义的类方法?
这有点棘手,因为您并没有真正覆盖类方法,对吧?因为它使用了在 class_methods
block 中定义类方法的关注 api。
所以说我有一个看起来像这样的问题:
module MyConcern
extend ActiveSupport::Concern
class_methods do
def do_something
#some code
end
end
end
在模型中.. 我如何重写该方法,以便在使用继承时可以像调用 super 一样调用它?所以在我的模型中我想去:
def self.do_something
#call module do_something
end
?
最佳答案
如果您在定义self.do_something
的模型中include
d MyConcern
,您应该能够使用 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
方法的地方。
关于ruby-on-rails - 如何覆盖 rails 模型中的 class_method 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38506173/