From: Robert Klemme Date: 2010-09-27T19:56:53+09:00 Subject: Re: Need assistance with hash of arrays and injecting values On Sat, Sep 25, 2010 at 2:29 PM, Alpha Blue wrote: > I'm creating a class that will run a number of tasks based on a start > and end date.  It only runs between week 4 and week 15 of my current > system. > > A current hash of arrays is defined for the current calendar year the > tasks run. > > @h = { >  :week_four => ["2010-09-20", "2010-09-26"], >  :week_five => ["2010-09-27", "2010-10-03"], >  :week_six => ["2010-10-04", "2010-10-10"], >  :week_seven => ["2010-10-11", "2010-10-17"], >  :week_eight => ["2010-10-18", "2010-10-24"], >  :week_nine => ["2010-10-25", "2010-10-31"], >  :week_ten => ["2010-11-01", "2010-11-07"], >  :week_eleven => ["2010-11-08", "2010-11-14"], >  :week_twelve => ["2010-11-15", "2010-11-21"], >  :week_thirteen => ["2010-11-22", "2010-11-28"], >  :week_fourteen => ["2010-11-29", "2010-12-05"], >  :week_fifteen => ["2010-12-06", "2010-12-12"] > } I don't see the point in defining this. There is class Date which abstracts dates and allows to do calculations on them. Also, encoding something which is numeric (the week number) as text in a Hash key seems overly awkward. This makes calculations of the kind "is date x in week y" overly complicated. > I want to inject these into a similar task: > > @current_week is an instance variable within the class that holds the > current week (i.e. week 10 for instance so '10') > > @weekly_report is defined as an array that will hold the report > listings. > > The VirtualReport.reportlistings method takes two dates - a start date > and an end date.  I only want them to run up to the current week.  So, > in this example, if it's week 10, it should run a report for week > 4,5,6,7,8,9, and 10.  But, it should not run a report for > 11,12,13,14,15.  Furthermore, it should check to ensure that the data is > not empty. > > for i in 0..(@current_week-4) >  @weekly_report = VirtualReport.reportlistings("INSERT HASH VALUES") > end > > Where I placed the INSERT HASH VALUES above is where I want to inject my > values based on the current week.  Therefore, I'm pretty certain the > hash needs to be ordered or sorted so that they maintain the current > week layouts.  But, I'm not very good with hashes in general and could > use some help or a better example of how to accomplish this task.  The > weekly reports will be stored in an array and used later on in the > class. > > Any help would be appreciated. I'd start with a proper representation of dates (class Date comes to mind) and add another one for representing weeks on top of that. So you could do # untested Week = Struct.new :start_date do def initialize(date) self.start_date = find_start_date(date) end def in_week?(date) (start_date ... (start_date + 7)).include? date end def week_of_year first = find_start_date(Date.new(start_date.year, 1, 1)) (start_date - first) / 7 + 1 end include Comparable def <=>(week) star_date <=> week.start_date end def succ self.class.new(start_date + 7) end def pred self.class.new(start_date - 7) end private def find_start_date(date) until date.monday? # or whatever should start your week date = date.prev_day end date end end Then base your other data structures on these primitive types. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/