Если ваши данные представляют собой время, я бы сохранил его как время - в противном случае вам всегда придется преобразовывать его из базы данных при выполнении операций с датой и временем. День - это избыточные данные, так как он будет частью объекта времени.
Это должно означать, что вам не нужно хранить список дней.
Если 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 или в качестве значения для использования в некоторой логике цикла в рельсах.