2007/8/20, Josselin <josselin / wanadoo.fr>:
> On 2007-08-19 09:58:46 +0200, Stefan Rusterholz <apeiros / gmx.net> said:
>
> > Josselin wrote:
> >> I am presently splitting an array on 4 successives periods of time , is
> >> there a DRYest way to do it, or that's the way to go ?  thanks
> >>
> >> @ads_id_w1 = advertisings.map {|ad| ad.id if ((ad.valid_until -
> >> ad.created_at) / 86400.0 <= 7)}.compact
> >>
> >> @ads_id_w2 = advertisings.map {|ad| ad.id if (((ad.valid_until -
> >> ad.created_at) / 86400.0 > 7) && ((ad.valid_until - ad.created_at) /
> >> 86400.0 <= 14)) }.compact
> >>
> >> @ads_id_w3 = advertisings.map {|ad| ad.id if (((ad.valid_until -
> >> ad.created_at) / 86400.0 > 14) && ((ad.valid_until - ad.created_at) /
> >> 86400.0 <= 21)) }.compact
> >>
> >> @ads_id_w4 = advertisings.map {|ad| ad.id if (((ad.valid_until -
> >> ad.created_at) / 86400.0 > 21) && ((ad.valid_until - ad.created_at) /
> >> 86400.0 <= 31)) }.compact
> >
> > class ClassOfAd
> >   def week # may want to name it differently
> >     return nil unless whateverdate.between?(acceptable_start,
> > acceptable_end) # your call here
> >     ((ad.valid_until - ad.created_at).div(604800)) % 4
> > end
> > @ads_id = Array.new(4) { [] }
> > advertisings.each {|ad| @ads_id[ad.week] = ad.id if ad.week }
> >
> > Depending on your needs that code can be condensed a bit more.
> >
> > Regards
> > Stefan
>
> thanks Stefan, I realize that, too frequently, I am programming Ruby as
> C ..  not using the OO potential
> what's one of the best book about "Programming Ruby, the way it should
> be..."  ?
> I need to practise outside my app dev
>
> note : also found that the  'week' has been already written.. :
> (ad.valid_until - ad.created_at) >= 2.weeks

Basically you need a more generalized version of partition. Maybe
something like this works:

@ads_id = advertisings.inject(Hash.new {|h,k| h[k]=[]}) do |h,ad|
  h[(((ad.valid_until - ad.created_at) / 86400 - 1) / 7] << ad.id
  h
end

Note, I'm using interger arithmetic to reduce the number of result values.

Kind regards

robert