From: Robert Klemme Date: 2007-06-29T16:55:06+09:00 Subject: Re: Dynamic sort_by criteria, making it DRY... thanks Robert ! On 29.06.2007 08:12, Josselin wrote: > On 2007-06-28 23:18:36 +0200, Josselin said: > >> On 2007-06-28 13:58:47 +0200, Robert Klemme >> said: >> >>> On 28.06.2007 13:41, Josselin wrote: >>>> I am presently using a sort_by on my array >>>> >>>> => buddies = user_buddies.sort_by {|item| item.last_seen_at} >>>> >>>> I would like to be able to do the same , based on a variable >>>> @criteria set to the item key to be used >>>> >>>> @criteria = 'last_seen_at' @criteria = 'display_name' ...... >>>> >>>> => buddies = user_buddies.sort_by {|item| item.<@criteria> } >>>> >>>> what could be the best way to do it ? >>>> >>>> Depending upon another variable @reverse_order = true or false, I >>>> would like to perform or not teh reverse! action >>>> >>>> => buddies = user_buddies.sort_by {|item| item.last_seen_at}.reverse! >>>> >>>> I believe it should be >>>> >>>> => buddies = @reverse_order ? user_buddies.sort_by {|item| >>>> item.<@criteria> } : user_buddies.sort_by {|item| item.<@criteria> >>>> }.reverse! >>>> >>>> thanks for your enlightment ! >>> >>> buddies = user_buddies.sort_by {|it| it.send @criteria} >>> buddies.reverse! if @reverse_order >>> >>> Kind regards >>> >>> robert >> >> Thanks Robert cannot be dryest.... I am so ashame of my solution that >> I don't want to publish my code... > > btw , where should I write the 'downcase' method for strings > > I tried to write it into the @criteria (@criteria = > 'display_name.downcase' ) > which seems to be the right place.. > > but I got an error > undefined method `display_name.downcase' for # > > thanks for your complementary solution... ;-)) > > joss buddies = user_buddies.sort_by {|it| it.send(@criteria).downcase} But this works only if you know that all criteria are strings. Kind regards robert