Oh my goodness! A thousand apologies. I gave you a rotating month. See below. On Sat, Mar 1, 2008 at 3:03 AM, Todd Benson <caduceass / gmail.com> wrote: > > On Sat, Mar 1, 2008 at 2:34 AM, Mikkel Bruun <mikkel / helenius.dk> wrote: > > Todd Benson wrote: > > > On Fri, Feb 29, 2008 at 4:30 PM, Mikkel Bruun <mikkel / helenius.dk> > > > wrote: > > > > >> 5. week i need to show march 1 and 2 and the same in the front... > > >> > > > > >> mikkel > > > > > > Here's one for fun. I'm pretty sure you don't want to use this (for > > > all I know, you might be laughed out of the room :), but it > > > demonstrates some methods... > > > > > woot, it actually works.... > > > > ive been doing ruby since 2000 but i cant undestand what the h*ll going > > on there.... > > > > can you give me a walkthrough or a more humane rewrite ;-) > > Okay, changing the code... > > <CODE> > > require 'enumerator' > # I need that for the each_slice method later > today = Date.today offset = Date.new(today.year, today.month, 1).wday > # gives me the day of the week > months_of_concern = (-1..1).inject([]) {|arr, i| arr << (today.month + i)} > # just running through -1 to 1 and adding to the current month > # it gives you last month, current month, and next month numbers > # which will be handed to months_of_concern after the block finishes > month_ranges = months_of_concern.map {|month| 1..Date.new( today.year, > month, -1 ).day} > # building ranges to later turn into arrays > # you get previous, current, and future month ranges > # the month days > # -1 is used, as Morton so excellently pointed out > # as the _last_ number > # this is common in Ruby > > day_sets = month_ranges.map {|i| i.to_a} > # turning the Range objects (3 of them) into Array objects > # I should have used {|i| i.map} here because it > # would have been cuter, which is mostly disapproved > # of in production code :) > > offset.times { day_sets[1].unshift day_sets[0].pop } > # Here, we're just moving the last numbers of the last > # month to the first part of this month one by one > > day_sets[1..2].flatten.slice(0..35).compact.each_slice(7) {|i| p i} > # This one is actually easy to understand. > # Grab what we now have as the current month, > # tap on the ending month, > # flatten it (turn it into one big array), > # slice off the numbers that are in slots 0 to 35 > # compact (there might be nils) > # each_slice simply builds arrays by > # grabbing things 7 at a time. > > </CODE> > > Keep in mind scope. The "i" variable is local to each block; all by > himself. It doesn't have to be "i", also. My original code only worked when run on the first of the month. Pretty funny, actually. It's one of those things that a unit test wouldn't catch unless the test was written correctly. Todd