我正在使用 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, 11, 12, <...>)
)
)
)
它生成以下内容(注意:括号与第一个 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, <...>)))
由于我认为后一个 SQL 查询不像第一个那样“工作”,我怎么能使用 Arel(或者,也许是别的东西)来生成 SQL 查询作为第一个?
更新(评论后)
鉴于上面的 SQL 查询“工作”相同,但我仍然想生成与问题中的第一个完全相同的 SQL 查询(这样做的主要原因是第一个 SQL 查询比第二个更易读,因为在第一个一个使用较少和“显式”括号),我怎样才能通过使用 Arel 来做到这一点?