これが私が選んだ解決策です。トリックはleft outer join
を使用することでした (rubyコマンドeager_load)ユーザーおよびblocked_date_periodsテーブルの場合、および結合テーブルのstart_dateフィールドがNULLであるユーザーを含みます。これは、ブロックされた日付オブジェクトが関連付けられていないためです。私が使用するクエリ:
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
クエリが何らかの理由で正確な終了日を包含したくなかったため、開始日と終了日から1時間を加算および減算する必要がありました。そのため、2015年12月22日から2015年12月22日までの期間には2015年12月26日が含まれませんでした。 2015年12月16日何らかの理由で私はまだ理解していません。
何らかの理由で私はその解決策が好きではなく、私が持っているものよりも優れていて速いクエリがあるかどうか知りたいです。