Her er den løsning, jeg valgte. Tricket var at bruge left outer join
(ruby-kommando eager_load) for brugere og blocked_date_periods-tabellen, og inklusive de brugere, hvis start_date-felt i den sammenføjede tabel er NULL, naturligvis fordi de ikke har nogen blokerede datoobjekter tilknyttet dem selv. Forespørgslen jeg bruger:
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
Jeg var nødt til at tilføje og trække 1 time fra start- og slutdatoen, fordi forespørgslen af en eller anden grund ikke ønskede at omfatte nøjagtige slutdatoer, så 26-12-2015 var ikke inkluderet i perioden fra 22-12-2015 til 16-12-2015 af en eller anden grund mangler jeg endnu at forstå.
Af en eller anden grund kan jeg ikke lide den løsning og vil gerne vide, om der er en forespørgsel, der er bedre og hurtigere end den, jeg har.