让我假装我在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
答案 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
。