Inilah solusi yang saya pilih. Triknya menggunakan left outer join
(perintah ruby bersemangat_load) untuk pengguna dan tabel block_date_periods, dan termasuk pengguna yang bidang tanggal_mulai dalam tabel yang digabungkan adalah NULL, jelas karena mereka tidak memiliki objek tanggal yang diblokir yang terkait dengan diri mereka sendiri. Kueri yang saya gunakan:
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
Saya harus menambah dan mengurangi 1 jam dari tanggal mulai dan akhir karena kueri tidak ingin mencakup tanggal akhir yang tepat karena beberapa alasan, sehingga 26-12-2015 tidak termasuk dalam periode dari 12-22-2015 hingga 16-12-2015 untuk beberapa alasan saya belum mengerti.
Untuk beberapa alasan saya tidak menyukai solusi itu dan ingin tahu apakah ada kueri yang lebih baik dan lebih cepat dari yang saya miliki.