在 Rails 上动态定义 Concern 中的实例方法
Define instance methods in Concern dynamically on 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
谢谢。
您可以使用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 is a great article to deal with such stuff and you can find dynamic method creation guide from Dynamic Method Creation
我只是想将用户输入参数转换为时间对象,所以我试图为此定义一个关注点。
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
谢谢。
您可以使用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 is a great article to deal with such stuff and you can find dynamic method creation guide from Dynamic Method Creation