【问题标题】:Arel: How to cleanly join multiple conditions with OR?Arel:如何用 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 周围的方式。它是否提供了更好的方法来加入一组动态生成的条件?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 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 并且文章不响应“或”。
      猜你喜欢
      • 2011-12-20
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 2011-03-05
      • 2023-02-08
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多