如何从模块中引用的Class Constant数组中编写元编程方法?

Rob*_*yle 5 ruby inheritance ruby-on-rails

我编写了一个基本的Eventable模块,允许其他类为自己创建事件.所有模型都有自己的一组事件,例如Message存在sentUsersign_in事件.我想在类级别创建一个事件数组作为常量,并访问模块内部的数组,以构建辅助方法来创建如下事件:

class User
  EVENT_TYPES = ['sign_in', 'sign_out']
  include Eventable
end
Run Code Online (Sandbox Code Playgroud)
class Message
  EVENT_TYPES = ['sent', 'opened']
  include Eventable
end
Run Code Online (Sandbox Code Playgroud)
module Eventable
  extend ActiveSupport::Concern

  included do
    has_many :events, as: :eventable
    attr_accessor :metadata

    self::EVENT_TYPES.each do |event_type|
      define_method "create_#{event_type}_event" do |args={}|
        Event.create(eventable: self, event_type: event_type)
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这个问题是:方法没有正确定义.它无法EVENT_TYPES正确引用相应模型的常量.

如何从模块中获取类常量?

Ser*_*sev 4

我想说,像这样使用常量并不是很红宝石风格。这更惯用(至少在 Rails 中)。

class Message
  include Eventable

  event_types :sent, :opened
end
Run Code Online (Sandbox Code Playgroud)

这是实现

module Eventable
  extend ActiveSupport::Concern

  module ClassMethods
    def event_types(*names)
      names.each do |event_type|
        define_method "create_#{event_type}_event" do |args={}|
          Event.create(eventable: self, event_type: event_type)
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)