Список доступных пользователей на определенную дату - PullRequest
1 голос
/ 20 июля 2010

Я смотрю на создание системы бронирования, и мне нужно отобразить всех доступных пользователей в определенный день / время.

Подумав об этом, я собираюсь настроить таблицу, чтобы вести заметкио том, когда люди не доступны, и предположить, что они доступны в противном случае.Структура, которую я имел в виду, заключалась в том, чтобы записывать дату_старта, когда они не будут доступны, а затем дату_конца.

Теперь возникает проблема, когда я пытаюсь забронировать встречу, если яхочу заказать что-то во вторник с 11:00 до 13:00. Мне нужно получить список тех людей, которые доступны на данный момент, то есть у меня нет забронированных праздников в это время.

Любые идеи илимысли?Я буду использовать Ruby on Rails, если это поможет / помешает чьим-либо идеям.

1 Ответ

2 голосов
/ 20 июля 2010

Вот один из способов его моделирования.Допустим, у нас есть модель «Обручение», которая имеет дату начала, дату окончания и имя.У участия есть много пользователей через другую таблицу соединений, называемую 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.

Давайте сделаем это методом объекта взаимодействия, поскольку он полностью зависит от объекта взаимодействияdata.

#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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...