在 ARel 中,这些where()
方法可以将数组作为参数来生成“WHERE id IN...”查询。所以你写的内容是正确的。
例如,下面的 ARel 代码:
User.where(:id => Order.where(:user_id => 5)).to_sql
...相当于:
User.where(:id => [5, 1, 2, 3]).to_sql
... 将在 PostgreSQL 数据库上输出以下 SQL:
SELECT "users".* FROM "users" WHERE "users"."id" IN (5, 1, 2, 3)"
更新:回应评论
好吧,所以我误解了这个问题。我相信您希望子查询显式列出要选择的列名,以便不使用两个查询访问数据库(这是 ActiveRecord 在最简单的情况下所做的)。
您可以project
在select
子选择中使用:
accounts = Account.arel_table
User.where(:id => accounts.project(:user_id).where(accounts[:user_id].not_eq(6)))
...这将产生以下SQL:
SELECT "users".* FROM "users" WHERE "users"."id" IN (SELECT user_id FROM "accounts" WHERE "accounts"."user_id" != 6)
我真诚地希望这次我已经给了你你想要的!