列出特定日期的可用用户

时间:2010-07-20 09:35:52

标签: ruby-on-rails mysql scheduling

我正在考虑制作预订系统,我需要在特定日期/时间显示所有可用用户。

考虑到这一点,我打算设置一张表来记录人们何时不可用,并假设他们可以使用。我想到的结构是记下date_start到何时不可用,然后是date_end。

现在问题出现在我正在尝试预订会议时,如果我想在星期二11:00到13:00预订一些东西,我需要获取那些可用的人员列表,即“不要”在这段时间内预订了任何假期。

任何想法或想法?如果这有助于/阻碍任何人的想法,我将使用Ruby on Rails。

1 个答案:

答案 0 :(得分:2)

这是建模的一种方式。假设我们有一个模型'Engagement',它有一个开始日期时间,结束日期时间和名称。通过另一个名为“user_engagements”的联接表(具有相应的UserEngagement模型),订阅有许多用户。所以我们有

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

现在我们有一个很好的简单架构。参与基本上模拟正在发生的事情,而user_engagements模拟被预定做这件事的用户。我们有一个假设(不写入代码),当他们做某事时,他们无法做任何事情。

我们的下一个任务是编写一个方法,返回给定时间段内可用的用户,即新的参与。因此,我们进行了一次互动,我们希望所有没有参与的用户都与我们的新订婚相交叉。我认为最简单的方法可能是找到所有具有交叉参与度的用户,然后返回所有不是他们的用户。如果你明白我的意思。说e2与e1交叉的更精确的方式是e2在e1结束之前开始并且在e1开始之后结束。

让我们将其作为参与对象的一种方法,因为它完全依赖于参与的数据。

#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

我觉得有一种更有效的方法可以在一个查询中获得这个但我无法完全理解sql。