mysql - 使用现有条件哈希创建 OR 语句

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

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

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

Model.where(conds)

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

最佳答案

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

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)

关于mysql - 使用现有条件哈希创建 OR 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22411407/

相关文章:

mysql - SQL:如何计算特定顺序的项目

ruby-on-rails - 目录 : Securing a Closed API

ruby-on-rails - _changed 放在哪里合适? Rails 中的方法?

ruby-on-rails - 如何最好地将地址关联到 rails 中的多个模型?

ruby-on-rails - 属性保存在开发中,但未保存在生产中

ruby-on-rails - 多种产品类型的购物车的Rails方式

php - 在两个表中搜索并使用 PDO 合并结果

Mysql-如何根据四分之一列将行更改为列

php - 从 MySQL 数据库输出一个 longblob 的空 PHP

ruby-on-rails - actions_as_taggable_on : how to optimize the query?