Här är lösningen jag valde. Tricket var att använda left outer join
(ruby-kommando eager_load) för användare och blocked_date_periods-tabellen, och inklusive de användare vars start_date-fält i den sammanfogade tabellen är NULL, uppenbarligen för att de inte har några blockerade datumobjekt kopplade till sig själva. Frågan jag använder:
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
Jag var tvungen att lägga till och subtrahera 1 timme från start- och slutdatumet eftersom frågan av någon anledning inte ville omfatta exakta slutdatum, så att 2015-12-26 inte ingick i perioden från 2015-22-12 till 2015-12-16 av någon anledning ska jag ännu inte förstå.
Av någon anledning gillar jag inte den lösningen och skulle vilja veta om det finns en fråga som är bättre och snabbare än vad jag har.