【问题标题】:Getting the name of Ruby method for a literal hash query获取文字哈希查询的 Ruby 方法的名称
【发布时间】:2011-06-08 17:16:11
【问题描述】:

在 Rails 应用程序中,我为一个名为 Record 的模型提供了许多属性。我想设计一个方法,当在属性上调用时,返回属性的名称(本质上是 Record 对象上的方法)。然后将该名称传递给一个哈希,该哈希返回一个数字(在本示例中,假设该数字是一个百分比,然后乘以原始属性值得到一个new value)。

例如,假设我的记录有四个属性:teachersstudentsprincipalsparents。该方法将如下所示:

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

但这对我不起作用,因为我需要 以前 执行的方法的名称。

如果您对实现我的目标的替代方法有任何建议,我很乐意尝试其他方法。

【问题讨论】:

  • 您能否发布一个示例,说明您的预期方法调用是什么样的?令人困惑的部分(对我来说)是您说您在属性上调用方法的地方。你的意思是Record.students.some_method 还是some_method(Record.students)?还是别的什么?
  • 在上面的代码中,我使用前者,并将 self 传递给哈希。该示例看起来像Record.students.new_value,它将返回self * PERCENTAGE[self.name]。后一种选择也可以。 (问题已编辑 - 很抱歉造成混淆!)

标签: ruby-on-rails ruby methods hash


【解决方案1】:

Ryan,我很难理解你的问题,但我认为这就是你想要的,例如 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

【讨论】:

  • 第二个绝对是要走的路——这正是我想要的。谢谢本!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2014-10-05
  • 1970-01-01
相关资源
最近更新 更多