【问题标题】:Creating an OR statement using existing conditions hash使用现有条件哈希创建 OR 语句
【发布时间】:2014-03-14 17:03:52
【问题描述】:

我正在解决一个问题,我需要将 OR 子句添加到一组现有条件中。当前条件构建在方法中的散列中,最后在 where 子句中使用。这是一个简化的例子:

...
conds.merge!({:users => {:archived => false}})

Model.where(conds)

我正在尝试将 OR 子句添加到当前的一组条件中,因此它类似于“(条件)或 new_condition”。我想添加 OR 语句而不将每个添加到 conds 散列转换为字符串。那将是我最后的选择。我希望有人以前做过这样的事情(不使用 Arel)。我似乎记得在 Rails 2 中有一种方法可以使用模型中的方法解析条件散列(类似Model.some_method(conds) 会产生 where 子句字符串。也许将 OR 子句添加到该字符串。任何想法都表示赞赏。感谢您的帮助!

【问题讨论】:

    标签: mysql ruby-on-rails activerecord ruby-on-rails-4


    【解决方案1】:

    我找到了一种方法来做我需要的事情。我没有更改我正在构建的所有条件,而是使用 sanitize_sql_for_conditions 将条件解析为 SQL。这是 ActiveRecord 中的私有方法,所以我必须在模型上放置一个方法以允许我访问它。这是我的模型方法:

    def self.convert_conditions_hash_to_sql(conditions)
      self.sanitize_sql_for_conditions(conditions)
    end
    

    因此,一旦我将条件转换为文本,我就可以将我的 OR 子句(连同适当的括号)添加到原始条件的末尾。所以,它会是这样的:

    Model.where('(?) OR (model.type = ? AND model.id IN(?))', Model.convert_conditions_hash_to_sql(conds), model_type, model_id_array)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-30
      • 2023-02-07
      • 1970-01-01
      • 2013-06-18
      • 2017-01-31
      • 1970-01-01
      • 2015-10-06
      • 2018-08-05
      相关资源
      最近更新 更多