I have a little example Rails app called tickets, which views and edits fictional tickets sold to various customers. In tickets_controller.rb, inside def index
, I have this standard line, generated by scaffolding:
@tickets = Ticket.find(:all)
To sort the tickets by name, I have found two possible approaches. You can do it this way:
@tickets = Ticket.find(:all, :order => 'name')
... or this way:
@tickets = Ticket.find(:all).sort!{|t1,t2|t1.name <=> t2.name}
(Tip: Ruby documentation explains that sort!
will modify the array that it is sorting, as opposed to sort
alone, which returns the sorted array but leaves the original unchanged).
What strategy do you normally use? When might you use .sort!
versus the :order => 'criteria'
syntax?
The Ruby sort method works by comparing elements of a collection using their <=> operator (more about that in a second), using the quicksort algorithm. You can also pass it an optional block if you want to do some custom sorting. The block receives two parameters for you to specify how they should be compared.
Use :order => 'criteria'
for anything simple that can be done by the database (ie. basic alphabetical or chronological order). Chances are it's a lot faster than letting your Ruby code do it, assuming you have the right indexes in place.
The only time I could think you should use the sort
method is if you have a complex attribute that's calculated at run-time and not stored in the database, like a 'trustworthiness value' based off number of good/bad responses or something. In that case it's better to use the sort
method, but be aware that this will screw things up if you have pagination in place (each page will have ITS results in order, but the set of pages as a whole will be out of order).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With