我的范围看起来像这样:
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"和"年龄"必须得到一个匹配,以便取给我任何记录。
我是想尝试以错误或低效的方式做到这一点?
答案 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