2011-06-08 62 views
1

在一个rails应用程序中,我有一个称为Record的模型的许多属性。我想要设计一种方法,在属性上调用时返回属性的名称(实际上它是Record对象上的一个方法)。然后这个名字被传递给一个哈希,它返回一个数字(为了这个例子,说这个数字是一个百分比,然后乘以原始属性值得到一个new value)。为文字哈希查询获取Ruby方法的名称

例如,假设我的Record具有四个属性:teachers,students,principalsparents。然后,该方法将如下所示:

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

你能发表一个你想要的方法调用会是什么样子的例子吗?令人困惑的部分(对我来说)就是你说你在属性上调用方法的地方。你的意思是'Record.students.some_method'或'some_method(Record.students)'?或者是其他东西? – Larsenal 2011-06-08 17:45:42

+0

在上面的代码中,我使用前者,并将自己传递给哈希。这个例子看起来像'Record.students.new_value',它会返回'self * PERCENTAGE [self.name]'。后面的选项也可以。 (编辑的问题 - 抱歉的混乱!) – 2011-06-08 17:50:10

回答

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 
+0

第二个肯定是要走的路 - 这正是我想要的。谢谢Ben! – 2011-06-08 18:01:53