I can sort an array like that :
results = rs.sort_by{|p| p.km}
but I tried to add a scrond sorting criteria like that :
results = rs.sort_by{|p| p.km, p.updated_at }
and I got obviously an error … parse error, unexpected ‘}’,
expecting tCOLON2 or ‘[’ or ‘.’
canot find the correct writing…
appreciate any help…
thanks
joss
On Jan 9, 2007, at 8:30 AM, Josselin wrote:
I can sort an array like that :
results = rs.sort_by{|p| p.km}
but I tried to add a scrond sorting criteria like that :
results = rs.sort_by{|p| p.km, p.updated_at }
results = rs.sort_by { |p| [p.km, p.updated_at] }
Arrays can be sorted and will compare their contents in order, so
this should do what you want.
Hope that helps.
James Edward G. II
Hi –
On Tue, 9 Jan 2007, Josselin wrote:
canot find the correct writing…
Try this:
results = rs.sort_by {|p| [p.km, p.updated_at] }
David
On 09/01/07, Josselin [email protected] wrote:
canot find the correct writing…
appreciate any help…
thanks
joss
results = rs.sort_by{|p| [p.km,p.updated_at]}
Farrel
On 2007-01-09 15:29:43 +0100, Josselin [email protected] said:
canot find the correct writing…
appreciate any help…
thanks
joss
thanks to both of you… and HNY%2007 (Dry version of Happy New Year
2007) ;-))
I forgot to ask about a DESC sort… p.km is Ascending and
p.updated_at should be DESC…
I am not sure that is possible (at least not documented…)
joss
On 2007-01-09 15:53:13 +0100, “Jan S.” [email protected] said:
results = rs.sort_by{|p| p.km, -p.updated_at } # if updated_at is Numeric
or
results = rs.sort { |a,b| [a.km, b.updated_at] <=> [b.km, a.updated_at] }
thanks , ‘updated_at’ is a string ( “2007-01-04 13:48:30”)
I try to understand the writing… why the first parameter will be
Ascending and the second Descending …
how would you write it, if both parameters shoudl be Descending ?
Joss
Hi –
On Tue, 9 Jan 2007, Josselin wrote:
thanks to both of you… and HNY%2007 (Dry version of Happy New Year 2007)
;-))
Actually Happy New Year 2007 is already pretty DRY, although it does
use two 0’s…
Yours is more like the golf version 
David
On 1/9/07, Josselin [email protected] wrote:
and I got obviously an error … parse error, unexpected ‘}’,
thanks to both of you… and HNY%2007 (Dry version of Happy New Year
- ;-))
I forgot to ask about a DESC sort… p.km is Ascending and
p.updated_at should be DESC…
I am not sure that is possible (at least not documented…)
joss
results = rs.sort_by{|p| p.km, -p.updated_at } # if updated_at is
Numeric
or
results = rs.sort { |a,b| [a.km, b.updated_at] <=> [b.km, a.updated_at]
}
Hi –
On Wed, 10 Jan 2007, Josselin wrote:
joss
how would you write it, if both parameters shoudl be Descending ?
results = rs.sort_by {…}.reverse
David
On 1/9/07, [email protected] [email protected] wrote:
results = rs.sort_by{|p| p.km}
appreciate any help…
thanks , ‘updated_at’ is a string ( “2007-01-04 13:48:30”)
I try to understand the writing… why the first parameter will be Ascending
and the second Descending …
how would you write it, if both parameters shoudl be Descending ?
results = rs.sort_by {…}.reverse
Ok, two things:
- how does my code works:
The block in sort {|x,y| } implements x<=>y (<=>, comparison operator,
sometimes called starship operator, returns -1, 0 or 1 for x <y, x==y
and x> y)
[a,b] <=> [c,d] (array comparision) is implemented as first doing
a<=>c and if they are equal doing b<=>d. if I exchange b and d, I
effectively reverse the result of the second comparision.
If I wanted the reverse sort, I could exchange both pairs, i.e.
instead of doing x<=>y I’d be doing y <=> x.
- sort_by is usually faster than sort because it does n block
evaluations, while sort does O(n*n) evaluations. Therefore sort_by
{}.reverse is usually better than sort{|a,b| b<=> a} (except some edge
cases where computaton is fast, and the block’s result is large)
On Jan 9, 2007, at 8:30 AM, Josselin wrote:
I can sort an array like that :
results = rs.sort_by{|p| p.km}
but I tried to add a scrond sorting criteria like that :
results = rs.sort_by{|p| p.km, p.updated_at }
Try this.
results = rs.sort_by { |p| [p.km, p.updated_at] }
This way you’re sorting arrays containing each of the sort criteria.