PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

ActiveRecord:Làm thế nào để tìm cha mẹ có TẤT CẢ con cái phù hợp với một điều kiện?

Sử dụng arel có thể đưa bạn đi khá xa. Phần khó khăn là làm thế nào để bạn không viết toàn bộ truy vấn của mình bằng arel cú pháp truy vấn của riêng?

Đây là một mẹo:khi tạo truy vấn của bạn bằng cách sử dụng where , nếu bạn sử dụng arel điều kiện, bạn nhận được một số phương pháp bổ sung miễn phí. Ví dụ:bạn có thể điều chỉnh truy vấn con mà bạn có ở đó bằng .exists.not , điều này sẽ giúp bạn nhận được một (NOT ( EXISTS (subquery))) Quăng cái đó vào where -từ bỏ và bạn đã sẵn sàng.

Câu hỏi là, làm thế nào để bạn tham chiếu các bảng liên quan? Bạn cần Arel cho điều đó. Bạn có thể sử dụng Arel's where với các điều kiện xấu như a.eq b . Nhưng tại sao? Vì đó là một điều kiện bình đẳng, bạn có thể sử dụng các điều kiện của Rails để thay thế! Bạn có thể tham chiếu bảng mà bạn đang phân tích bằng khóa băm, nhưng đối với bảng khác (trong truy vấn bên ngoài), bạn có thể sử dụng arel_table của bảng đó . Xem cái này:

parents = Parent.arel_table
Parent.where(
  Child.where(other_parent_id: nil, parent_id: parents[:id]).exists.not
)

Bạn thậm chí có thể giảm mức sử dụng Arel bằng cách sử dụng chuỗi một chút và dựa vào thực tế là bạn có thể cấp dữ liệu trong các truy vấn con dưới dạng tham số cho Rails 'where . Không có nhiều tác dụng với nó, nhưng nó không buộc bạn phải đào sâu vào các phương thức của Arel quá nhiều, vì vậy bạn có thể sử dụng thủ thuật đó hoặc các toán tử SQL khác sử dụng một truy vấn con (thậm chí có bất kỳ phương thức nào khác không?):

parents = Parent.arel_table
Parent.where('NOT EXISTS (?)',
  Child.where(parent_id: parents[:id], other_parent_id: nil)
)

Hai điểm chính ở đây là:

  • Bạn có thể tạo các truy vấn con giống như cách bạn quen tạo các truy vấn thông thường, tham chiếu đến bảng của truy vấn bên ngoài với Arel. Nó thậm chí có thể không phải là một bảng thực, nó có thể là một bí danh! Đồ điên rồ.
  • Bạn có thể sử dụng các truy vấn con làm tham số cho Rails 'where phương pháp tốt.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngăn các chuỗi trống trong trường CHARACTER VARYING

  2. Pivot / crosstab có nhiều cột giá trị

  3. Thư viện SQL tốt nhất để sử dụng trong Common Lisp là gì?

  4. Cách sử dụng pgBackRest để sao lưu PostgreSQL và TimescaleDB

  5. Chênh lệch múi giờ trong giờ làm việc