ruby-on-rails – 在Rails 4.2中使用Arel的WHERE子句中的OR运算
发布时间:2020-12-16 23:08:03 所属栏目:百科 来源:网络整理
导读:以下代码在Rails 4.1中构造了一个带有OR运算符的有效where子句 MyModel.where( MyModel.where(attribute1: 1,attribute2: 2).where_values.reduce(:or)) 这大致相当于SQL select * from my_models where (attribute1 = 1 OR attribute2 = 2) 在Rails 4.2中,
以下代码在Rails 4.1中构造了一个带有OR运算符的有效where子句
MyModel.where( MyModel.where(attribute1: 1,attribute2: 2).where_values.reduce(:or) ) 这大致相当于SQL select * from my_models where (attribute1 = 1 OR attribute2 = 2) 在Rails 4.2中,相同的代码生成一个SQL查询,其缺少值的绑定参数 select * from my_models where attribute1 = OR attribute2 = …并且由于缺少绑定值的值而生成错误. Rails 4.2中用OR运算符生成有效查询的等效代码是什么? 编辑: 该解决方案需要使用Arel :: Nodes :: Node派生对象,以便它本身可以通过AND和OR分组与其他条件组合. rel = MyModel.where(attribute1: 1,attribute2: 2) conditions = [rel.where_values.reduce(:or).to_sql,*rel.bind_values.map(&:last)] MyModel.where(conditions) 条件var必须是Arel :: Nodes :: Node的衍生物.上述解决方案适用于简单查询,但对于更复杂的查询,条件必须是要传递给最终查询方法的Arel节点. 解决方法
我正在使用下面的东西,直到导轨5出来(在导轨5 AR支持.or):
ActiveRecord::QueryMethods::WhereChain.class_eval do def or(*scopes) scopes_where_values = [] scopes_bind_values = [] scopes.each do |scope| case scope when ActiveRecord::Relation scopes_where_values += scope.where_values scopes_bind_values += scope.bind_values when Hash temp_scope = @scope.model.where(scope) scopes_where_values += temp_scope.where_values scopes_bind_values += temp_scope.bind_values end end scopes_where_values = scopes_where_values.inject(:or) @scope.where_values += [scopes_where_values] @scope.bind_values += scopes_bind_values @scope end end 有了以上你可以做到: MyModel.where.or(attribute1: 1,attribute2: 2) # or MyModel.where.or(MyModel.where(some conditions),MyModel.where(some other conditions)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容