2016-07-26 67 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'後面調用,否則定義的方法會再次被覆蓋。 –

相關問題