Home » Ruby » Sort array returned by ActiveRecord by date (or any other column)

Sort array returned by ActiveRecord by date (or any other column)

Posted by: admin November 30, 2017 Leave a comment

Questions:

How can I sort an array returned by an ActiveRecord query by a created_at date column?

This occurs once the query has been executed.

Please don’t tell me to do it in the query because I need this to happen in the view.

Answers:

Ruby includes support for sorting out of the box.

sorted = @records.sort_by &:created_at

However, this doesn’t appear to have much to do with display and probably belongs in the controller.

Questions:
Answers:

While Ruby Enumerable is awesome, ActiveRecord queries will actually return an ActiveRecord::Relation whose query will not have been evaluated yet (Lazy Loading) and can have the order method called on it to off-load this processing to the database where it will scale much better than an Enumerable based strategy.

Using Enumerable for sorting also confounds doing pagination in the database. There is nothing to prevent the order strategy from being applied in the view. However, I would tend to put this in scope on the model.

sorted = @records.order(:created_at)

Questions:
Answers:

Just call sort on the collection, passing in the block of code which tells Ruby how you want it to sort:

collection.sort { |a,b| a.created_at <=> b.created_at }

Questions:
Answers:

Please loot at this one and also check complexities.

Model.all.sort_by{|m| m.created_at} #=> O(log n)

#versus

Model.order(“created_at DESC”) #=> O(1)

Questions:
Answers:

The best way sorting ActiveRecord array is using default method order

@users.order(:created_at)

It’s the quickest and the most right solution, because in that case it returns sorted array from db and you no need to use any other operation for that in the Class, for example if you will use suggested sort_by it will loop throw each element of array, and after that it won’t be an ActiveRecord array, not cool in my opinion.

order can use strings and sumbols, it’s very useful, and it takes multiple parameters

@users.order(‘created_at asc, first_name desc, last_name asc’)