Arel:如何用 OR 干净地连接多个条件?
Posted
技术标签:
【中文标题】Arel:如何用 OR 干净地连接多个条件?【英文标题】:Arel: How to cleanly join multiple conditions with OR? 【发布时间】:2011-02-28 20:40:12 【问题描述】:在我的 Rails 应用程序中,我循环遍历一个数组以创建一个必须由 OR 连接的条件列表。以下是我目前这样做的基本流程。
conditions = nil
set.each do |value|
condition = value.to_condition
conditions = conditions ? conditions.or(condition) : condition
end
显然,它并不漂亮,但我仍然不完全了解我在 Arel 周围的方式。它是否提供了更好的方法来加入一组动态生成的条件?
【问题讨论】:
【参考方案1】:这非常适合inject
,它将为您提供一个可以在其他东西中使用的单线:
conditions = set.inject |conds, cond| conds.or(cond)
甚至可以写成:set.inject(&:or)
非常好。
【讨论】:
哇——我喜欢inject
,过度使用它,不知何故错过了这个场景!谢谢! :)
我相信它会创建一个看起来像 (((c1 or c2) or c3) or c4) 的条件。你知道是否可以将它们定义为(c1 或 c2 或 c3 或 c4)?
github.com/rails/arel/blob/master/lib/arel/nodes/or.rb 似乎表明 Arel 的 or
概念是二元的。因此,“否”将是您问题的答案。
有什么区别?你为什么想要这个,或者在乎?
@Roman - 您可以使用#expr 删除不必要的括号:conditions = set.inject |conds, cond| conds.or(cond).expr
@omuriauga - 没有不必要的括号看起来更好。【参考方案2】:
还有一个有用的插件。
conditions_helper
它有助于生成复杂的条件。
【讨论】:
【参考方案3】:我想基本上就是这样。我会初始化基础对象的条件以避免三元:
scope = Article
set.each|v| scope = scope.or(v.to_condition)
【讨论】:
使用 Arel 3.0.3 和 activerecord 3.2.16 并且文章不响应“或”。以上是关于Arel:如何用 OR 干净地连接多个条件?的主要内容,如果未能解决你的问题,请参考以下文章