Список доступных пользователей в определенную дату

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

Думая об этом, я собираюсь настроить таблицу для хранения примечания того, когда люди НЕ доступны, и предполагают, что они в других отношениях доступны. Структура, которую я имел в виду, должна была сохранить примечание date_start того, когда они не будут доступны, и затем date_end.

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

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

1
задан amr 20 July 2010 в 09:35
поделиться

1 ответ

Вот один из способов его моделирования. Допустим, у нас есть модель «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.

2
ответ дан 2 September 2019 в 22:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: