Получение имени метода Ruby для литерального хеш-запроса - PullRequest
1 голос
/ 08 июня 2011

В приложении rails у меня есть ряд атрибутов для модели под названием Запись.Я хочу разработать метод, который при вызове атрибута возвращает имя атрибута (который по сути является методом объекта Record).Это имя затем передается в 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

, но это не сработает для меня, потому что мне нужно имя ранее выполненного метода.

Если у вас есть какие-либо предложения относительно альтернативного подхода к достижению моей цели, я был бы рад попробовать что-то еще.

1 Ответ

2 голосов
/ 08 июня 2011

Райан, я изо всех сил пытаюсь понять твой вопрос, но я думаю, что это то, что ты хочешь, для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...