Rails 4.2.8中ActiveRecord多命名作用域的OR查询实现
组合命名作用域实现OR查询(Rails 4.2.8)
嘿,在Rails 4.2里要实现多个命名作用域的OR查询,确实得绕个小弯——因为原生的or方法是到Rails 5才引入的。不过我们可以用Arel(Rails底层的查询构建器)来搞定这个需求,而且能完美复用你已经定义好的black和modern作用域。
方法一:直接用Arel组合条件
你可以通过获取两个作用域的where子句,然后用Arel的or方法把它们拼起来:
# 直接查询满足black OR modern的车辆 Car.where(Car.black.arel.where_clause.or(Car.modern.arel.where_clause))
这个方法的好处是完全复用了你已有的作用域逻辑——哪怕之后black或modern的查询规则变了,这里的代码不用改,维护性拉满。
方法二:封装成新的命名作用域(推荐)
如果这个查询会多次用到,不如直接在Car模型里定义一个新的作用域,把逻辑封装起来:
class Car < ActiveRecord::Base # 已有的三个作用域 scope :modern, -> { ... } scope :black, -> { ... } scope :bmw, -> { ... } # 新增组合作用域 scope :black_or_modern, -> { where(black.arel.where_clause.or(modern.arel.where_clause)) } end
之后你就可以像用其他作用域一样,直接调用Car.black_or_modern来获取结果了,非常方便。
验证结果
这样查询出来的结果集就会包含:
- 旧款黑色日产(满足
black条件) - 现代白色宝马(满足
modern条件) - 现代黑色福特(同时满足两个条件,自然也会被包含)
完全符合你想要的结果~
内容的提问来源于stack exchange,提问作者Rakib
相关产品推荐
相关产品推荐

