在Ruby中,如果给出N个参数,如何编写一个链式命名范围N次的可链接方法

时间:2015-04-22 06:55:27

标签: ruby-on-rails activerecord method-chaining

我有一个命名范围: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

1 个答案:

答案 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