Need assistance with hash of arrays and injecting values

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 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.

Thanks,

JD

···

--
Posted via http://www.ruby-forum.com/.

As an example of what the method looks like when run properly:

@weekly_report = VirtualReport.reportlistings("2010-09-20", "2010-09-26)
etc..

Thanks.

···

--
Posted via http://www.ruby-forum.com/.

If I understood correctly, you want to get for values of i
4,5,6,7,8,9,10 the arrays corresponding to the key :week_<week>,
so, first, you need to translate from the number to the word (4 =>
four). The easiest way would be to change your @h array, if possible:

@h = {
  4 => ["2010-09-20", "2010-09-26"],
  5 => ["2010-09-27", "2010-10-03"],
  ...
}

If this is not possible, I would build a translation hash for that:

TRANSLATION = {4 => :week_four, 5 => :week_five, ...}

and do:

4.upto(@current_week) do |week|
  weekly_report = VirtualReport.reportlistings(@h[TRANSLATION[i]])
  # do something with the report
end

Hope this helps,

Jesus.

···

On Sat, Sep 25, 2010 at 2:29 PM, Alpha Blue <jdezenzio@gmail.com> 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 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'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

···

On Sat, Sep 25, 2010 at 2:29 PM, Alpha Blue <jdezenzio@gmail.com> wrote:

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

Thanks Jesus, that works perfect and is much more simplified.

4.upto(@current_week) do |week|
  @weekly_report = VirtualReport.reportlistings(@h[week][0],@h[week][1])
  p "#{@h[week][0]} and #{@h[week][1]}"
end

···

--
Posted via http://www.ruby-forum.com/.

Then base your other data structures on these primitive types.

Kind regards

robert

Hi Robert, I'll have to mull over everything you just posted.
Eventually, I would like to clean up a lot of my date code. Originally
I had based the start and end weeks on the dates they were compiled_on
in the database. The dates in the database were simply YYYY-MM-DD
format. When I compiled data, I updated the compiled_on dates and when
I further tasked specific database tables for calculation entries, I
looked within the compiled_on date parameters.

This in turn has not made for a clean way of working with things over
time in a modular fashion. If, for example, I place 10 years worth of
data, it's difficult and messy to create yearly hashes. This is partly
why I wanted to start optimizing and cleaning up my code and then work
more concisely within a class.

Again, I'll look over your example and see what I can do.

···

--
Posted via http://www.ruby-forum.com/\.

You could also do:

...
  weekly_report = VirtualReport.reportlistings(*@h[week])
...

Jesus.

···

On Sun, Sep 26, 2010 at 5:27 PM, Alpha Blue <jdezenzio@gmail.com> wrote:

Thanks Jesus, that works perfect and is much more simplified.

4.upto(@current_week) do |week|
@weekly_report = VirtualReport.reportlistings(@h[week][0],@h[week][1])
p "#{@h[week][0]} and #{@h[week][1]}"
end