Hier ist die Lösung, die ich gewählt habe. Der Trick war die Verwendung von left outer join
(Ruby-Befehl Eager_Load) für Benutzer und die Tabelle „blocked_date_periods“ und einschließlich der Benutzer, deren Feld „start_date“ in der verknüpften Tabelle NULL ist, offensichtlich, weil ihnen keine blockierten Datumsobjekte zugeordnet sind. Die Abfrage, die ich verwende:
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
Ich musste 1 Stunde vom Start- und Enddatum addieren und subtrahieren, da die Abfrage aus irgendeinem Grund keine genauen Enddaten umfassen wollte, sodass der 26.12.2015 nicht im Zeitraum vom 22.12.2015 bis enthalten war 16.12.2015 aus irgendeinem Grund, den ich noch nicht verstehe.
Aus irgendeinem Grund gefällt mir diese Lösung nicht und ich würde gerne wissen, ob es eine Abfrage gibt, die besser und schneller ist als meine.