我有一个命名范围:name_not_like
,如果:name匹配模式,则忽略关系中的记录
scope :name_not_like, lambda { |n| where('name NOT ILIKE ?', n) }
我有一个省略每个汤姆,迪克和哈里的方法:
def self.except_tom_dick_harry
name_not_like("%tom%").name_not_like("%dick%").name_not_like("%harry%")
end
如何编写一个方法except_these_names()
,给定N个名称的数组将链接name_not_like()
N次,以便
except_these_names(["%tom%", "%dick%", "%harry%", "%sam%", "%fred%"])
会像except_tom_dick_harry()一样,但对于数组中的所有名称?像这样:
def self.except_these_names(array_of_names)
array_of_names.each do |name|
# somehow 'stack' calls to name_not_like(name) ??
end
end
答案 0 :(得分:3)
我认为这样的事情应该有用。当您需要积累以前的结果时,reduce
非常适合。
def self.except_these_names(names)
names.reduce(scoped) do |criteria, name|
criteria.name_not_like("%#{name}%")
end
end
或者实际上,你可以用一个简单的方法。只需将criteria
var放在循环之外。
def self.except_these_names(array_of_names)
criteria = scoped
array_of_names.each do |name|
criteria = criteria.name_not_like(...)
end
criteria
end