Ето решението, което избрах. Номерът беше в използването на left outer join
(ruby команда eager_load) за потребители и таблица blocked_date_periods и включително онези потребители, чието поле start_date в обединената таблица е NULL, очевидно защото нямат блокирани обекти за дата, свързани със себе си. Заявката, която използвам:
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
Трябваше да добавя и изваждам 1 час от началната и крайната дата, защото заявката не искаше да обхване точните крайни дати по някаква причина, така че 26.12.2015 г. не беше включена в периода от 22.12.2015 г. до 16-12-2015 по някаква причина, която все още не разбирам.
По някаква причина не харесвам това решение и бих искал да знам дали има заявка, която е по-добра и по-бърза от това, което имам.