在 Rails 中,如何在每个关注点和模型中调用相同的方法?

In Rails, how to call same methods on every concern and in model?

我有一个模型和很多关注点,我想从每个关注点和模型本身调用相同的方法,我想知道这是否可能。

假设我有一个这样的模型,它有三个关注点和一个 setup_defaults 方法。

class Item < ApplicationRecord
    include ConcernOne
    include ConcernTwo
    include ConcernThree

    def setup_defaults
        # model code here
    end
end

我想在 运行 以及模型中的每个问题中都有一个 setup_defaults,所以它看起来像这样:

module ConcernOne
    extend ActiveSupport::Concern
    def setup_defaults
        # concern one code
    end
end

module ConcernTwo
    extend ActiveSupport::Concern
    def setup_defaults
        # concern two code
    end
end

module ConcernThree
    extend ActiveSupport::Concern
    def setup_defaults
        # concern three code
    end
end

所以我想要 concern one code,然后是 concern two code,然后是 concern one code,最后是 model code here 到 运行。

我试过像这样使用 super 但它只是 运行 最后一个关注代码,然后是模型代码:

class Item < ApplicationRecord
    include ConcernOne
    include ConcernTwo
    include ConcernThree

    def setup_defaults
        super
        # model code here
    end
end

我可以 运行 所有 3 个问题 setup_defaults 然后是模型的 setup_defaults 吗?这可能吗?

谢谢。

Can I run all 3 concerns setup_defaults and then the model’s setup_defaults? Is this possible?

是的,你已经拥有了。您唯一缺少的是互相提出您的担忧。

module ConcernOne
  extend ActiveSupport::Concern
  def setup_defaults
    super if defined?(super) # do the same for other concerns and the model
    puts 'one'
  end
end

输出:

Item.new.setup_defaults
# >> one
# >> two
# >> three
# >> main