2016-07-26 5 views
1

ユーザ入力パラメータをTimeオブジェクトに変換したいだけなので、そのための関心事を定義しようとしています。Raster上でConcernのインスタンスメソッドを動的に定義する

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'の後に呼び出されなければならないことを知っています。あるいは、定義されたメソッドが再びオーバーライドされます。 –

関連する問題