2016-07-26 2 views
1

Я просто хочу преобразовать входные параметры пользователя в объект Time, поэтому я пытаюсь определить для этого проблему.Определить методы экземпляра в Концерне динамически на Rails

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 

Спасибо.

ответ

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

+0

Спасибо! Я пробовал это. Высказывается вопрос, который я получил: 'attr_date' должен вызывать после' attr_accessor', иначе метод будет переопределен. –