【发布时间】:2016-11-09 00:56:54
【问题描述】:
我想为 find_by 功能创建一堆方法。我不想一遍又一遍地写同样的东西,所以我想使用元编程。
假设我想创建一个按名称查找的方法,接受名称作为参数。我该怎么做?我过去使用过 define_method,但我没有任何参数可以采用该方法。 这是我的(坏)方法
["name", "brand"].each do |attribute|
define_method("self.find_by_#{attribute}") do |attr_|
all.each do |prod|
return prod if prod.attr_ == attr_
end
end
end
有什么想法吗?提前致谢。
【问题讨论】:
-
请注意,如果所有数据集都是大型数据集,这可能会导致性能问题。我也真诚地希望这不在 Rails 上下文中,因为 rails 已经为每个属性实现了
find_by_XXX。 -
注意:这将定义两个名为
self.find_by_name和self.find_by_brand的方法。虽然可以创建这样的方法,但使用普通的方法调用语法来调用它们是不可能的,因为.不是标识符中的合法字符。你有什么特别的原因要定义一个非法名称的方法吗? -
@engineersmnky 这不是轨道! all 只为玩具商店的库存系统返回一个
Products数组。这是 Udacity Ruby 纳米学位的最终项目。 -
@JörgWMittag 我对此一无所知,我想知道为什么会出现 NoMethodError,因为我有一个 self.something 方法。
标签: ruby metaprogramming