2010-07-20 4 views
1

Je cherche à faire un système de réservation et j'ai besoin d'afficher tous les utilisateurs disponibles sur une journée/heure particulière. En pensant à cela, je vais mettre en place une table pour garder à l'esprit quand les gens ne sont pas disponibles, et supposer qu'ils sont autrement disponibles. La structure que j'avais en tête était de garder une note du date_start du moment où ils ne seront pas disponibles, et ensuite le date_end. Maintenant, le problème se pose lorsque j'essaie de réserver une réunion, si je veux réserver quelque chose le mardi de 11h00 à 13h00, j'ai besoin d'aller chercher une liste de ces personnes qui sont disponibles alors, c.-à-d. Il n'y a pas de vacances réservées pendant cette période.Liste des utilisateurs disponibles à une certaine date

Des idées ou des pensées? J'utiliserai Ruby on Rails si cela aide/gêne les idées de quelqu'un.

Répondre

2

Voici une façon de le modéliser. Disons que nous avons un modèle 'Engagement' qui a un début datetime, fin datetime et un nom. Un engagement a de nombreux utilisateurs, via une autre table de jointure appelée 'user_engagements' (avec le modèle UserEngagement correspondant). Nous avons donc

User 
    has_many :user_engagements 
    has_many :engagements, :through => :user_engagements 

Engagement 
    #fields - starts_at, ends_at (both datetime) 
    has_many :user_engagements 
    has_many :users, :through => :user_engagements 

UserEngagement 
    belongs_to :user 
    belongs_to :engagement 

Maintenant, nous avons un joli schéma simple. Un engagement modélise fondamentalement quelque chose qui se passe, et user_engagements modèle les utilisateurs qui ont réservé pour faire quelque chose. Nous avons une hypothèse (non écrite dans le code) que lorsqu'ils font quelque chose, ils ne sont pas disponibles pour faire autre chose.

Notre tâche suivante consiste à écrire une méthode qui renvoie les utilisateurs disponibles dans un délai donné, c'est-à-dire un nouvel engagement. Donc, nous prenons un engagement et nous voulons que tous les utilisateurs qui n'ont pas un engagement qui croise avec notre nouvel engagement. Je pense que la façon la plus simple de le faire pourrait être de trouver tous les utilisateurs qui ont un engagement croisé, puis de retourner tous les utilisateurs qui ne le sont pas. Si tu vois ce que je veux dire. Une manière plus précise de dire que e2 se croise avec e1 est que e2 commence avant la fin de e1 ET se termine après le début de e1. Faisons-en une méthode d'un objet d'engagement car elle dépend totalement des données d'un engagement.

#in Engagement 
def unavailable_user_ids 
    User.find(:all, :include => [:user_engagements], :select => "users.id", :conditions => ["user_engagements.starts_at < ? and user_engagements.ends_at > ?", self.ends_at, self.starts_at]).collect(&:id) 
end 

def available_users 
    User.find(:all, :conditions => ["id not in (?)", self.unavailable_user_ids]) 
end 

je me sens comme il y a un moyen plus efficace pour obtenir ce dans une requête, mais je ne peux pas à mettre le doigt sur le sql.

+0

Excellent! Cela ressemble exactement à ce que je cherchais, je vais voir jusqu'où je vais en arriver là. Je vous remercie :) – amr

Questions connexes