如何知道共同关心的当前班级

时间:2018-10-31 17:47:45

标签: ruby-on-rails activesupport-concern

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

非常相似,即使不完全相同,代码也存在3个不同的类中。

store_accessor调用实际上包装在一个循环中,该循环遍历一个类方法,该类方法返回属性名称列表(这对于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

足够简单。.但是,我想将所有这些代码移至关注点(boo,his),并与3个受影响的类中的每一个共享该关注点。我遇到的问题是...我不知道当前哪个班级正在关注该问题。换句话说,Foo不是Foo ...这是三个使用关注点的类别中的任何一个。

在关注范围内,我如何使用当前课程?在此示例中,我将如何动态调用当前类而不是调用Foo类?

2 个答案:

答案 0 :(得分:1)

检查一下:

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

答案 1 :(得分:1)

在关注中使用included时,包含类将作为参数传递给该块:

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,因为访问器是在类上下文中声明的。

请记住,这只是以下方面的语法糖:

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