If your data is time, I would save it as time - otherwise you will always have to convert it from the database when you perform operations related to it with the date and time. This day is redundant as it will be part of the time object.
This means that you do not need to keep a list of days.
If t is time, then
t.strftime('%A')
will always give you a day as a string in English. Then it could be transferred to i18n as needed.
Therefore, you only need to save the start time and end time, or the start time and duration. Both must be equivalent. I will be tempted to save the final time myself if you need to manipulate the data by the end time, so it does not need to be calculated.
I think most of the rest of what you are describing should also drop out of time data storage as instances of Time.
Ordering by week and time will simply be ordered by your time column. i.e.
daily_class.find(:all, :conditions => ['whatever'], :order => :starting_time)
Grouping by day is a little more complicated. However, this is a great article on how to group by week. Grouping by day will be similar.
If you are dealing with non-trivial data volumes, it might be better to do this in the database using find_by_sql , and this may depend on your time functions and the date of your database, but again storing data as Time will also help you here. For example, in Postgresql (which I use) getting a class week
date_trunc('week', starting_time)
which you can use in a Group By clause, or as a value to use in some loop logic in rails.