Rails,如何在它们之间使用“and”运算符链接范围?

Posted

技术标签:

【中文标题】Rails,如何在它们之间使用“and”运算符链接范围?【英文标题】:Rails, how do I chain scopes with an "and" operator between them? 【发布时间】:2014-12-16 11:50:10 【问题描述】:

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

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

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

我使用这个作用域的循环如下所示:

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

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

我是否试图以错误或低效的方式来做这件事?

【问题讨论】:

【参考方案1】:
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

【讨论】:

虽然这完美地解决了它,但如果您希望它与“或”运算符链接起来会是什么样子? @Majoren 这是一个不同的问题,所以为它开始一个新线程。 @simonwo ***.com/questions/26489531/…

以上是关于Rails,如何在它们之间使用“and”运算符链接范围?的主要内容,如果未能解决你的问题,请参考以下文章

rails中的“and”与“&&”运算符[重复]

如何使用 OR 而不是 AND 链接范围查询?

函数中多个值之间的 AND 运算符

Rails:如何管理同步数据的两个表之间的关联?

Rails:我的显示视图中的“下一篇文章”和“上一篇文章”链接,如何?

在引导程序模式之间切换