探测器方法的元编程

时间:2011-01-24 23:16:56

标签: ruby-on-rails metaprogramming

让我假装我在Stuff表中有一些项目。名字是: RedBaloon,SmallBall,BigShoe,ShoeString

我想使用元编程为我创建find_by_name方法。

我遇到的问题是我想使用以下方法作为方法的名称: red_baloon,small_ball,big_shoe,shoestring

注意:“鞋带”不是拼写错误。

以下是我开始提供的一些代码供您回复:

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 :(得分:0)

就像@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