如何知道当前class里面的共同关注

How to know the current class inside shared concern

我有 3 个模型,每个模型都有一个 hstore 列,其中可能包含相同的 4 个属性。促进这些 hstore 属性的代码包括 store_accessor 调用,一种用于与强参数共享这些 hstore 属性的方法,以及一些其他方法。

非常相似,如果不完全一样,代码存在于 3 个不同的 classes 中。

store_accessor 调用实际上包含在一个循环中,该循环通过 class 方法循环,​​该方法 returns 属性名称列表(对于每个属性名称可能是唯一的,也可能不是唯一的) 3 个模型)。

class Foo

  def self.array_of_attrs
    %w(one two three)
  end

  Foo.array_of_attrs.each do |a|
    ...
    store_accessor :hstore_col_name, "#{ a }_yada_yada".to_sym
  end

足够简单。但是,我想将所有这些代码移到一个关注点(嘘声,嘶嘶声),并与 3 个受影响的 class 中的每一个分享这个关注点。我遇到的问题是...我不知道目前是哪个 class 调用了这个问题。换句话说,Foo 不是 Foo...它是 3 classes 中使用关注点的那个。

关注里面,我怎么用现在的class?在此示例中,我将如何动态调用当前 class 而不是调用 Foo class?

看看这个:

module Foo
  def self.included(base)
    base.class_eval do

      def self.some_method
        array_of_attrs.each do |a|
          ...
          store_accessor :hstore_col_name, "#{ a }_yada_yada".to_sym
        end
      end

    end
  end
end

class Model < ApplicationRecord
  include Foo

  def self.array_of_attrs
    %w(one two three)
  end
end

Model.some_method

当您在关注中使用 included 时,包含的 class 作为参数传递给块:

module Bar
  extend ActiveSupport::Concern
  included do |base|
    base.array_of_attrs.each do |a|
     # ...
     store_accessor :hstore_col_name, "#{ a }_yada_yada".to_sym
    end
  end
end

class Foo < ApplicationRecord
  include Bar
end

是的,您应该使用 included,因为访问器是在 class 上下文中声明的。

请记住,这只是一个语法糖:

module Baz
  def self.included(base)
    base.class_eval do
      # ...
    end
  end
end