PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Implémentation de dates bloquées pour un modèle ORM d'événement utilisateur

Voici la solution que j'ai choisie. L'astuce consistait à utiliser left outer join (commande ruby ​​impatient_load) pour les utilisateurs et la table block_date_periods, et y compris les utilisateurs dont le champ start_date dans la table jointe est NULL, évidemment parce qu'ils n'ont aucun objet de date bloqué associé à eux-mêmes. La requête que j'utilise :

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

J'ai dû ajouter et soustraire 1 heure de la date de début et de fin car la requête ne voulait pas englober les dates de fin exactes pour une raison quelconque, de sorte que le 26/12/2015 n'était pas inclus dans la période du 22/12/2015 au 16/12/2015 pour une raison que je n'ai pas encore comprise.

Pour une raison quelconque, je n'aime pas cette solution et j'aimerais savoir s'il existe une requête meilleure et plus rapide que celle que j'ai.