Как бы вы построили этот ежедневный график занятий? - PullRequest
4 голосов
/ 09 января 2009

То, что я хочу сделать, очень просто, но я пытаюсь найти лучший или самый элегантный способ сделать это. Приложение Rails, которое я создаю сейчас, будет иметь расписание ежедневных занятий. Для каждого класса поля, относящиеся к этому вопросу:

  • День недели
  • Время начала
  • Время окончания

Одна запись может быть чем-то вроде:

  • день недели: среда
  • время начала: 10:00
  • время окончания: полдень

Также я должен упомянуть, что это двуязычное приложение Rails 2.2, и я использую встроенную функцию i18n Rails. У меня на самом деле есть несколько вопросов.

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

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

Что касается времени начала и окончания каждого класса, вы бы использовали поля даты и времени или целочисленные поля? Если последнее, как бы вы это реализовали?

Будем рады прочитать различные предложения, которые вы, ребята, предложите.

Ответы [ 3 ]

3 голосов
/ 10 января 2009

Я бы просто сохранил день недели как целое число. 0 => Понедельник ... 6 => Воскресенье (или любым другим способом, т. Е. 0 => Воскресенье). Затем сохраните время начала и время окончания как Время.

Это сделало бы группирование действительно легким. Все, что вам нужно сделать, это отсортировать по дню недели и времени начала.

Вы можете отобразить это несколькими способами, но вот что я бы сделал.

  1. Имеют такие функции, как: @sunday_classes = DailyClass.find_sunday_classes, которая возвращает все классы за воскресенье, отсортированные по времени начала. Затем повторите для каждого дня.

    def find_sunday_classes
      find_by_day_of_week(1, :order -> 'start_time')
    end

    Примечание: find_by, вероятно, должен иметь идентификатор в конце, но это просто предпочтение в том, как вы хотите назвать столбец.

  2. Если вам нужна полная неделя, позвоните всем семи из контроллера и выполните цикл через них в представлении. Вы даже можете создавать страницы с подробностями для каждого дня.

  3. Перевод - единственная сложная часть. Вы можете создать вспомогательную функцию, которая принимает целое число и возвращает текст для соответствующего дня недели на основе локального.

Это очень просто. Ничего сложного.

2 голосов
/ 09 января 2009

Если ваши данные представляют собой время, я бы сохранил его как время - в противном случае вам всегда придется преобразовывать его из базы данных при выполнении операций с датой и временем. День - это избыточные данные, так как он будет частью объекта времени.

Это должно означать, что вам не нужно хранить список дней.

Если t время, то

t.strftime('%A')

всегда даст вам день в виде строки на английском языке. Затем он может быть переведен i18n по мере необходимости.

Таким образом, вам нужно только сохранить время начала и время окончания, или время начала и продолжительность. Оба должны быть эквивалентны. Я бы соблазнился сохранить время окончания самостоятельно, на случай, если вам понадобится выполнить манипуляции с данными о времени окончания, которые, следовательно, не нужно рассчитывать.

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

Заказ по дням и времени недели будет зависеть от заказа по вашему столбцу времени. т.е.

daily_class.find(:all, :conditions => ['whatever'], :order => :starting_time)

Группировка по дням немного более сложно. Однако это отличный пост о том, как группировать по неделям. Группировка по дням будет аналогичной.

Если вы имеете дело с нетривиальными объемами данных, может быть лучше сделать это в базе данных с find_by_sql, и это может зависеть от функциональности вашей базы данных по времени и дате, но опять же, хранение данных в виде Время также поможет вам здесь. Например, в Postgresql (который я использую), получение недели занятий составляет

date_trunc('week', starting_time)

, который можно использовать в предложении Group By или в качестве значения для использования в некоторой логике цикла в рельсах.

1 голос
/ 09 января 2009

Re дней недели, если вам нужно, например, классы, которые встречаются 09: 00-10: 00 в MWF, тогда вы можете либо использовать отдельную таблицу для дней, когда класс встречается (определяется как ID класса и DOW), либо быть злыми (то есть ненормализованными) и сохранять эквивалент массив DOW в каждом классе. Классический аргумент таков:

  • Отдельная таблица может быть проиндексирована таким образом, чтобы поддерживать либо выборки, ориентированные на классы, либо выборки, ориентированные на DOW, но требуется немного больше клея, чтобы собрать все изображение вместе для класса.
  • Массив DOW проще визуализировать для начинающих программистов и немного проще программировать, но это означает, что рассуждения о DOW требуют рассмотрения всех классов.

Если это только для вашего личного расписания занятий, делайте то, что приносит вам желаемую ценность, и смирись с последствиями; если вы пытаетесь построить реальную систему для нескольких пользователей, я бы пошел с отдельной таблицей. Все эти правила нормализации существуют по причине.

Что касается (удобочитаемых) имен DOW, это проблема уровня представления, и она не должна входить в основную концепцию DOW. (Предположим, вы решили переехать в Монреаль, и вам нужен французский? Это должно быть еще одно «лицо», а не изменение основной реализации.)

Что касается времени начала / окончания, опять же проблема заключается в ваших требованиях. Если все занятия начинаются и заканчиваются в часовых (x: 00) границах, вы, безусловно, можете использовать 0..23 в качестве часов дня. Но тогда ваша жизнь станет несчастной, как только вы проведете этот 45-минутный семинар. Как говорилось в старой рекламе: «Заплати мне сейчас или заплати мне позже».

Один из подходов заключается в определении вашей собственной концепции ClassTime и разделении всех рассуждений о времени до этого класса. Он может начинаться с упрощенного представления (целые часы 0..23 или целые минуты после полуночи 0..1439), а затем «расти» по мере необходимости.

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