# Need assistance with hash of arrays and injecting values

**URL:** <https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569>\
**Category:** Ruby\
**Created:** [September 25, 2010, 2:29pm UTC](https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569 "2010-09-25T14:29:25Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![elricstorm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/da6949/32.png) [@elricstorm](https://www.ruby-forum.com/u/elricstorm)\
**Post date:** [September 25, 2010, 2:29pm UTC](https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569/1 "2010-09-25T14:29:25Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![elricstorm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/da6949/32.png) [@elricstorm](https://www.ruby-forum.com/u/elricstorm)\
**Post date:** [September 25, 2010, 2:32pm UTC](https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569/2 "2010-09-25T14:32:43Z")

</div>

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

@weekly\_report = VirtualReport.reportlistings(“2010-09-20”, "2010-09-26)  
etc…

Thanks.

---

<div class="post-metadata">

**Author:** ![elricstorm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/da6949/32.png) [@elricstorm](https://www.ruby-forum.com/u/elricstorm)\
**Post date:** [September 25, 2010, 10:31pm UTC](https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569/3 "2010-09-25T22:31:16Z")

</div>

On Sat, Sep 25, 2010 at 2:29 PM, Alpha B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> :week\_six =\> [“2010-10-04”, “2010-10-10”],
> 
> in this example, if it’s week 10, it should run a report for week  
> 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.

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\_,  
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.

---

<div class="post-metadata">

**Author:** ![elricstorm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/da6949/32.png) [@elricstorm](https://www.ruby-forum.com/u/elricstorm)\
**Post date:** [September 26, 2010, 6:51pm UTC](https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569/4 "2010-09-26T18:51:33Z")

</div>

On Sun, Sep 26, 2010 at 5:27 PM, Alpha B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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

You could also do:

…  
weekly\_report = VirtualReport.reportlistings(\*@h[week])  
…

Jesus.

---

<div class="post-metadata">

**Author:** ![elricstorm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/da6949/32.png) [@elricstorm](https://www.ruby-forum.com/u/elricstorm)\
**Post date:** [September 26, 2010, 5:27pm UTC](https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569/5 "2010-09-26T17:27:00Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![elricstorm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/da6949/32.png) [@elricstorm](https://www.ruby-forum.com/u/elricstorm)\
**Post date:** [September 27, 2010, 12:58pm UTC](https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569/6 "2010-09-27T12:58:33Z")

</div>

On Sat, Sep 25, 2010 at 2:29 PM, Alpha B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

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

> in this example, if it’s week 10, it should run a report for week  
> 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

---

<div class="post-metadata">

**Author:** ![elricstorm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/da6949/32.png) [@elricstorm](https://www.ruby-forum.com/u/elricstorm)\
**Post date:** [September 27, 2010, 7:26pm UTC](https://www.ruby-forum.com/t/need-assistance-with-hash-of-arrays-and-injecting-values/195569/7 "2010-09-27T19:26:48Z")

</div>

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