我已经将两个以几种不同方式实现的示例类放在一起,它们很好地反映了我想要在我的 Rails 模型中做的事情。我担心的是,我不知道使用这两种方法有什么问题(如果有的话)。而且我只找到了解释如何实施它们的帖子或使用它们时要避免/小心的一般警告。我还没有找到关于如何安全地完成此操作的清晰解释,以及我要注意什么或为什么我应该避免这种模式。
class X
attr_accessor :yn_sc, :um_sc
def initialize
@yn_sc = 0
@um_sc = 0
end
types = %w(yn um)
types.each do |t|
define_method("#{t}_add") do |val|
val = ActiveRecord::Base.send(:sanitize_sql_array, ["%s", val])
eval("@#{t}_sc += #{val}")
end
end
end
class X
attr_accessor :yn_sc, :um_sc
def initialize
@yn_sc = 0
@um_sc = 0
end
types = %w(yn um)
types.each do |t|
# eval <<-EVAL also works
self.class_eval <<-EVAL
def #{t}_add(val)
@#{t}_sc += val
end
EVAL
end
end
x = X.new
x.yn_add(1) #=> x.yn_sc == 1 for both