0

我有一个看起来像这样的范围:

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

我使用此范围的方式是遍历多个属性,并且对于每个属性,我将属性与“strings”变量中的一组多个字符串一起发送到范围中,这些字符串作为“foo|bar”发送到此范围|等”。所以对于每个属性,我检查属性值是否与任何字符串相似。

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

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

问题是,如果我有两个属性,“name”和“age”,并且只有“name”匹配“foo”,它仍然会获取所有与“foo”匹配的记录。我希望能够将这些范围调用与它们之间的“and”运算符链接起来,以便例如“name”和“age”都必须匹配才能获取任何记录。

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

4

1 回答 1

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
于 2014-10-21T10:32:45.240 回答