Trong ARel, các where()
phương thức có thể nhận mảng làm đối số sẽ tạo truy vấn "WHERE id IN ...". Vì vậy, những gì bạn đã viết là dọc theo dòng bên phải.
Ví dụ: mã ARel sau:
User.where(:id => Order.where(:user_id => 5)).to_sql
... tương đương với:
User.where(:id => [5, 1, 2, 3]).to_sql
... sẽ xuất ra SQL sau trên cơ sở dữ liệu PostgreSQL:
SELECT "users".* FROM "users" WHERE "users"."id" IN (5, 1, 2, 3)"
Cập nhật: để trả lời các bình luận
Được rồi, vì vậy tôi đã hiểu sai câu hỏi. Tôi tin rằng bạn muốn truy vấn con liệt kê rõ ràng các tên cột sẽ được chọn để không đánh vào cơ sở dữ liệu với hai truy vấn (đó là những gì ActiveRecord làm trong trường hợp đơn giản nhất).
Bạn có thể sử dụng project
cho phần select
lựa chọn phụ của mình:
accounts = Account.arel_table
User.where(:id => accounts.project(:user_id).where(accounts[:user_id].not_eq(6)))
... sẽ tạo ra SQL sau:
SELECT "users".* FROM "users" WHERE "users"."id" IN (SELECT user_id FROM "accounts" WHERE "accounts"."user_id" != 6)
Tôi chân thành hy vọng rằng tôi đã cho bạn những gì bạn muốn lần này!