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 干净地连接多个条件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ARel对子查询进行连接?

如何干净地使用:const char* 和 std::string?

如何用一行命令让 Systemd 崩溃

如何使用 AREL 执行条件 where 子句

mysql中on,in,as,where如何用,意思是啥?

如何在 Rails 中对 AREL 中的子查询进行连接