Метапрограммирование для метода поиска - PullRequest
0 голосов
/ 25 января 2011

Давайте представим, что у меня есть некоторые предметы в таблице вещей. Имена: RedBaloon, SmallBall, BigShoe, ShoeString

Я хочу использовать метапрограммирование для создания методов find_by_name для меня.

Проблема, с которой я столкнулся, заключается в том, что я хочу использовать следующие имена в качестве имен методов: red_baloon, small_ball, big_shoe, шнурок

Примечание: "шнурок" - это не опечатка.

Вот код, с которого я начал, чтобы вы могли на него ответить:

class Stuff < ActiveRecord::Base

  NAMES = ['RedBaloon', 'SmallBall', 'BigShoe', 'ShoeString']
  validates_inclusion_of :name, :in => NAMES

  class << self
      NAMES.each do |n|
          define_method "#{n}" do
              find_by_kind(n)
          end
      end
  end

end

1 Ответ

0 голосов
/ 23 марта 2011

Как сказал @apneadiving в их комментарии, вы используете специальный метод String#underscore. Вот как я бы убрал ваш код:

class Stuff < ActiveRecord::Base
  NAMES = ['RedBaloon', 'SmallBall', 'BigShoe', 'Shoestring']
  validates_inclusion_of :name, :in => NAMES

  class << self
    NAMES.each do |name|
      define_method name.underscore do
        find_by_kind name
      end
    end
  end
end

Я не знаю, есть ли другие проблемы, потому что я не смог найти хорошую документацию по validates_inclusion_of, но я думаю, что это решит вашу проблему.

Кроме того, в будущем вам не нужно интерполировать строку в идентичную строку ("#{string} - это string), и поскольку строки и символы являются допустимыми именами в этих методах, вам не нужно выполнить преобразование. Даже тогда используйте #to_string.

...