在Rails上动态定义关注中的实例方法

时间:2016-07-26 18:03:47

标签: ruby-on-rails ruby metaprogramming

我只是想将用户输入参数转换为Time对象,所以我试图定义一个关注点。

class Foo < ActiveRecord::Base
  include DateAttribute
  attr_date :date_column_1, :date_column_2
end

但是当我写下这个问题时,我遇到了如何在模块的class_methods块中定义实例方法的问题。

module DateAttribute
  extend ActiveSupport::Concern

  included do
    class_attribute :_attr_date, instance_accessor: false

    self._attr_date = []
  end

  class_methods do
    def attr_date(*attributes)
      self._attr_date = Set.new(attributes.map(&:to_s))

      # how to dynamic define setter methods by loop attributes here
    end

    def date_attributes
      self._attr_date
    end
  end
end

感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用class_eval动态创建方法。

这是一个简单的实现

module DateAttribute
  extend ActiveSupport::Concern

  included do
    class_attribute :_attr_date, instance_accessor: false

    self._attr_date = []
  end

  class_methods do
    def attr_date(*attributes)
      self._attr_date = Set.new(attributes.map(&:to_s))
       attributes.each do |attrib|
        class_eval <<-RUBY
        def #{attrib}(*arguments)
         arguments
        end

        def #{attrib}=(value)
          value
        end
      RUBY
      end
    end

    def date_attributes
      self._attr_date
    end
  end
end

Here是处理此类内容的好文章,您可以从Dynamic Method Creation找到动态方法创建指南