Aquí está la solución que elegí. El truco fue usar left outer join
(comando de Ruby ávido_cargar) para los usuarios y la tabla de períodos_fechas_bloqueados, e incluidos aquellos usuarios cuyo campo de fecha_de_inicio en la tabla unida es NULL, obviamente porque no tienen ningún objeto de fecha bloqueado asociado con ellos mismos. La consulta que uso:
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
Tuve que sumar y restar 1 hora de la fecha de inicio y finalización porque la consulta no quería abarcar fechas de finalización exactas por alguna razón, por lo que el 26-12-2015 no se incluyó dentro del período del 22-12-2015 al 16-12-2015 por alguna razón que aún no entiendo.
Por alguna razón no me gusta esa solución y me gustaría saber si hay una consulta mejor y más rápida que la que tengo.