通过在`included`方法中对它们进行评估来模块化类级方法调用

时间:2015-08-21 18:15:22

标签: ruby-on-rails ruby module

我正在使用一个使用flip gem功能标记的Rails项目。我们有一个Feature类,您可以在其中声明要使用的各种功能标志,

# app/models/feature.rb

class Feature < ActiveRecord::Base
  extend   Flip::Declarable
  strategy Flip::DeclarationStrategy

  feature :ivans_feature_A
  feature :ivans_feature_B
  feature :ivans_feature_C

  feature :kramers_feature_X
  feature :kramers_feature_X
end

随着项目的增长,我们在此文件中声明的功能标志数量也在增加。同事建议我们将相关的功能声明分解为单独的模块以组织事物。

我找到了一种方法来做到这一点,但这不是我以前见过的模式,所以我想知道是否有更标准的方法。我为每组想要组合在一起的功能定义了命名空间模块:

应用程序/型号/功能/ ivans_features.rb

module Features::IvansFeatures
  def self.included(base)
    base.feature :ivans_feature_A
    base.feature :ivans_feature_B
    base.feature :ivans_feature_C
  end
end

应用程序/型号/功能/ kramers_features.rb

module Features::KramersFeatures
  def self.included(base)
    base.feature :kramers_feature_X
    base.feature :kramers_feature_Y
  end
end

...并将它们包含在要素模型中:

# app/models/feature.rb

class Feature < ActiveRecord::Base
  extend   Flip::Declarable
  strategy Flip::DeclarationStrategy

  include  Features::IvansFeatures
  include  Features::KramersFeatures
end

将模块混合到一个类中是否很奇怪,其唯一目的是使用included回调在类上运行某些方法调用?

1 个答案:

答案 0 :(得分:1)

Feature课程中,您可以extend ActiveSupport::Concern然后执行类似

的操作
included do
  feature :kramers_feature_X
end
相关问题