在模型中覆盖 ActiveSupport::Concern

Override ActiveSupport::Concern in model

我有一个问题,看起来像这样:

module Foo
  extend ActiveSupport::Concern

  def bar
    puts "bar"
  end
end

其他三个模型使用该 class 方法,因为他们需要同样的东西。然后我有一个一次性模型需要该方法来做其他事情。我有这样的设置:

class FooFoo < ApplicationRecord
  def self.bar
    puts "foo bar"
  end
end

现在,当我调用 FooFoo.bar 时,它会打印 "foo" 而不是 "foo bar"。如何覆盖关注中定义的方法?我希望它只 运行 在我的模型中定义的方法,FooFoo,而不是关注中的方法,Foo。我环顾四周,但我认为我没有看到我需要的东西。如果能提供帮助,我们将不胜感激!

编辑:我也试过这个希望它能起作用但它没有:

class FooFoo < ApplicationRecord
  def FooFoo.bar # I used FooFoo.bar here instead of self.bar
    puts "foo bar"
  end
end

问题是您需要明确声明您希望 bar 成为 class 方法...

module Foo
  extend ActiveSupport::Concern

  class_methods do 
    def bar
      puts "bar"
    end
  end
end

现在,您可以覆盖它...

class FooFoo < ApplicationRecord
  def self.bar
    puts "foo bar"
  end
end