微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Arel使用’或’和’和’子句正确添加括号到SQL查询?

我正在使用 Ruby on Rails 3.2.2,我想生成以下SQL查询
SELECT `articles`.* FROM `articles` WHERE (`articles`.`user_id` = 1 OR `articles`.`status` = 'published' OR (`articles`.`status` = 'temp' AND `articles`.`user_id` IN (10,11,12,<...>)))

通过这种方式使用Arel

Article
 .where(
   arel_table[:user_id].eq(1)
   .or(arel_table[:status].eq("published"))
   .or(
     arel_table[:status].eq("temp")
     .and(
       arel_table[:user_id].in(10,<...>)
     )
  )
)

它会生成以下内容(注意:括号与第一个SQL查询不同):

SELECT `articles`.* FROM `articles` WHERE (((`articles`.`user_id` = 1 OR `articles`.`status` = 'published') OR `articles`.`status` = 'temp' AND `articles`.`user_id` IN (10,<...>)))

由于我认为后一个SQL查询不能作为第一个“工作”,我怎么能使用Arel(或者,可能还有别的东西)来生成SQL查询作为第一个

更新(评论后)

鉴于上面的SQL查询“工作”相同,但我仍然希望生成确切的SQL查询作为问题中的第一个(主要原因是第一个SQL查询比第一个SQL查询更可读一个用得少而且“明确”括号),我怎么能用Arel来做到这一点?

解决方法

我已经成功地使用了这个宝石: squeel在Arel之上,所以你不必乱用它.因此,为了生成您的查询,您可以在squeel中执行以下操作:
@articles = Article.
  where{
  ( user_id.eq(1) | status.eq('published') ) |
  ( user_id.in([10,'<...>']) & status.eq('temp') )
}

# since this is an ActiveRecord::Relation we can play around with it
@articles = @articles.select{ [ user_id,status ] }

# and you can also inspect your sql to see what is going to come out
puts @articles.to_sql

您的查询越复杂,您就越喜欢这个宝石.

原文地址:https://www.jb51.cc/mssql/76602.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐