Celui-ci m'a bloqué, alors j'espère que quelqu'un de plus intelligent que moi pourra m'aider.SQL: comment trouver un complément à un ensemble avec une fonction/valeur dérivée
Je travaille sur un projet de rails dans lequel j'ai un modèle de l'utilisateur qui a une association de clock_periods joint à lui, ayant la définition partielle suivante:
User
has_many :clock_periods
#clock_periods has the following properties:
#clock_in_time:datetime
#clock_out_time:datetime
named_scope :clocked_in, :select => "users.*",
:joins => :clock_periods, :conditions => 'clock_periods.clock_out_time IS NULL'
def clocked_in?
#default scope on clock periods sorts by date
clock_periods.last.clock_out_time.nil?
end
La requête SQL pour récupérer tous les cadencé utilisateurs est trivial:
SELECT users.* FROM users INNER JOIN clock_periods ON clock_periods.user_id = users.id
WHERE clock_periods.clock_out_time IS NULL
L'inverse cependant - trouver tous les utilisateurs qui sont actuellement cadencées sur - est trompeusement difficile. Je fini par utiliser la définition suivante de la portée du nom, bien que son hackish:
named_scope :clocked_out, lambda{{
:conditions => ["users.id not in (?)", clocked_in.map(&:id)+ [-1]]
}}
Ce qui me dérange à ce sujet est qu'il semble que il devrait y avoir une façon de le faire dans SQL sans avoir recours à des déclarations générant comme
SELECT users.* FROM users WHERE users.id NOT IN (1,3,5)
Quelqu'un a-t-il une meilleure solution ou est-ce vraiment la seule façon de le gérer?
+1 - Bon point, j'ai pensé à cela mais j'ai oublié quand j'écrivais ma réponse. –