【发布时间】:2013-05-18 00:28:34
【问题描述】:
我目前正在开发我的第一个 gem,并在元编程方面进行了我的第一次体验。
因此,我想要一些关于如何在类定义期间正确定义实例方法的反馈。
具体来说,我在 ActiveRecord 模型中创建了这个你应该 extend 的模块,如下所示:
class Duck < ActiveRecord::Base
extend UnitedAttributes::Model
attr_accessible :name, :weight
unite :weight, :kilogram
end
这里是UnitedAttribues::Model 模块的源代码。 https://github.com/nielsbuus/united_attributes/blob/master/lib/united_attributes/model.rb
这是一个没有多余代码的缩短版本:
module UnitedAttributes
module Model
def unite(accessor, unit, options = {})
class_eval do
define_method "united_#{accessor}" do
Attribute.new(self.send(accessor), options)
end
end
end
end
end
它似乎有效,但我有一些顾虑:
-
class_eval是在这里使用的正确方法吗? -
define_method是在这里使用的正确方法吗? - 选项哈希被传递到类方法中,并在实例方法主体内使用。这安全吗?有内存问题吗?
【问题讨论】:
标签: ruby-on-rails ruby activerecord metaprogramming