Zde je řešení, které jsem zvolil. Trik byl v použití left outer join
(ruby příkaz eager_load) pro uživatele a tabulku blocked_date_periods a včetně těch uživatelů, jejichž pole počátečního_datu ve spojené tabulce má hodnotu NULL, očividně proto, že k sobě nemají přiřazeny žádné blokované objekty data. Dotaz, který používám:
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
Musel jsem přidat a odečíst 1 hodinu od počátečního a koncového data, protože dotaz z nějakého důvodu nechtěl zahrnovat přesná koncová data, takže 26. 12. 2015 nebyl zahrnut do období od 22. 12. 2015 do 16.12.2015 z nějakého důvodu, kterému ještě nerozumím.
Z nějakého důvodu se mi toto řešení nelíbí a rád bych věděl, zda existuje dotaz, který je lepší a rychlejší než ten, který mám já.