Đây là giải pháp tôi đã chọn. Thủ thuật là sử dụng left outer join
(lệnh ruby wish_load) cho người dùng và bảng ngày tháng bị chặn, và bao gồm cả những người dùng có trường ngày tháng bắt đầu trong bảng đã kết hợp là NULL, rõ ràng là vì họ không có bất kỳ đối tượng ngày tháng bị chặn nào được liên kết với chính họ. Truy vấn tôi sử dụng:
User.eager_load(:blocked_date_periods).
where("blocked_date_periods.start_date is null OR
not tsrange(
blocked_date_periods.start_date - '00:59:59'::interval,
blocked_date_periods.end_date + '00:59:59'::interval
) @> ?::timestamp",
Date.parse(DATE_STRING)).count
Tôi đã phải cộng và trừ 1 giờ kể từ ngày bắt đầu và ngày kết thúc vì truy vấn không muốn bao gồm ngày kết thúc chính xác vì lý do nào đó, do đó, ngày 12-26-2015 không được bao gồm trong khoảng thời gian từ ngày 22-12-2015 tới Ngày 16 tháng 12 năm 2015 vì một số lý do tôi vẫn chưa hiểu.
Vì một số lý do, tôi không thích giải pháp đó và muốn biết liệu có truy vấn nào tốt hơn và nhanh hơn những gì tôi có.