Rails,我如何使用"和#34;链接范围?他们之间的运营商

时间:2014-10-21 09:41:42

标签: ruby-on-rails ruby orm chained scopes

我的范围看起来像这样:

scope :attr_similar_to, -> (attr, strings) { where("#{attr} similar to ?", "%(#{strings})%") }

我使用这个范围的方法是迭代许多属性,并且对于每个属性,我将属性与一组多个字符串一起发送到范围中'字符串'变量,它被发送到这个范围作为" foo | bar | etc"。因此,对于每个属性,我检查属性值是否与任何字符串类似。

我使用此范围的循环如下所示:

results = Model.none
attributes.each do |attr|
  results += attr_similar_to(attr, strings)
end

问题在于,如果我有两个属性," name"和"年龄",只有"姓名"匹配" foo",它仍会获取与" foo"匹配的所有记录。我希望能够用"和"之类的东西链接这些范围调用。他们之间的运营商,以便例如" name"和"年龄"必须得到一个匹配,以便取给我任何记录。

我是想尝试以错误或低效的方式做到这一点?

1 个答案:

答案 0 :(得分:2)

results = Model.all    # Model.scoped in rails 3

attributes.each do |attr|
  results = results.attr_similar_to(attr, strings)
end

或者更简洁:

results = attributes.inject(Model.all) do |result, attr| 
  result.attr_similar_to(attr, strings)
end