在rails应用程序中,我有一个名为Record的模型的许多属性。我想设计一个方法,当在属性上调用时,返回属性的名称(它本质上是Record对象上的一个方法)。然后将此名称传递给Hash,Hash返回一个数字(为了这个例子,假设数字是一个百分比,然后乘以原始属性值得到new value
)。
例如,假设我的记录有四个属性:teachers
,students
,principals
和parents
。该方法将如下所示:
def name
**something here**
end
并且相应的new_value
方法和PRECENTAGE
哈希看起来像这样:
def new_value
self * PERCENTAGE[self.name]
end
PERCENTAGE = {
"teachers" => 0.40,
"students" => 0.53,
"principals" => 0.21,
"parents" => 0.87
}
然后,为了执行这一切,我会做Record.students.new_value
,这将根据哈希中获得的百分比返回新的学生数。
我知道要获取当前正在执行的方法的名称,您可以执行以下操作:(在http://ryat.la/7RDk上找到)
def this_method
__method__
end
但这对我不起作用,因为我需要以前执行方法的名称。
如果您对实现目标的替代方法有任何建议,我会很乐意尝试其他方法。
答案 0 :(得分:2)
record.teachers_percent
:
["teachers", "students", "principals", "parents"].each do |attrib|
Record.class_eval <<-RUBY
def #{attrib}_percent
#{attrib} * PERCENTAGE[#{attrib.inspect}]
end
RUBY
end
虽然这可能是一个更清洁的解决方案,但要提供record.percent(:teachers)
或record.percent("teachers")
:
class Record
def percent(attrib)
self.send(attrib) * PERCENTAGE[attrib.to_s]
end
end