Ruby on rails Ruby gem使用块中定义的方法扩展类

Ruby on rails Ruby gem使用块中定义的方法扩展类,ruby-on-rails,ruby,gem,Ruby On Rails,Ruby,Gem,我正在创建一个gem,希望能够通过为序列化属性动态创建属性getter和setter来修改ActiveRecord对象。例如: class User has_serialized :setting do |config| config.define :notify_by_email, default: true config.define :notify_by_phone, default: true end end user = User.new user.notif

我正在创建一个gem,希望能够通过为序列化属性动态创建属性getter和setter来修改ActiveRecord对象。例如:

class User
  has_serialized :setting do |config|
    config.define :notify_by_email, default: true
    config.define :notify_by_phone, default: true
  end
end

user = User.new
user.notify_by_email? # true
user.notify.by_phone? # true
user.notify_by_email = false
user.notify_by_phone = false
user.notify_by_email? # false
user.notify.by_phone? # false

我意识到我需要用一个模块扩展ActiveRecord,该模块包含已序列化的方法
,并且我需要使用
define\u方法
来添加自定义getter和setter,但是我不知道如何使用定义所需的块语法将两者结合起来。有什么想法吗?

您可以创建一个类,扩展用于捕获参数的哈希,然后使用该类执行块。一旦完成,您就可以迭代捕获执行define方法。以下是一个例子:

class Initializer < Hash
  def define(settings, options = {})
    self[setting] = options
  end
end

module ClassMethods
  def has_serialized(name, &block)
    initializer = Initializer.new
    block.call(initializer)
    initializer.each do |method, options|
      define_method "#{method}?" do
        ...
      end
      define_method "#{method}=" do |value|
        ...
      end
    end
  end
end
类初始值设定项