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

时间:2019-04-15 13:51:08

标签: ruby-on-rails ruby activerecord super activesupport-concern

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

因此,假设我有一个像这样的模型,它涉及三个方面和一个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 codeconcern one code,最后model code here

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

class Item < ApplicationRecord
    include ConcernOne
    include ConcernTwo
    include ConcernThree

    def setup_defaults
        super
        # model code here
    end
end

我可以同时运行所有三个问题setup_defaults,然后运行模型的setup_defaults吗?这可能吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

  

我可以同时运行所有三个问题setup_defaults,然后运行模型的setup_defaults吗?这可能吗?

是的,您已经拥有了。您唯一缺少的一点就是相互唤起您的担忧。

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