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

前端 未结 5 1241
南方客
南方客 2020-12-22 23:34

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

相关标签:
5条回答
  • 2020-12-22 23:58

    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')

    0 讨论(0)
  • 2020-12-23 00:00

    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.

    0 讨论(0)
  • 2020-12-23 00:01

    Please look 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)
    
    0 讨论(0)
  • 2020-12-23 00:11

    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 }
    
    0 讨论(0)
  • 2020-12-23 00:18

    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)
    
    0 讨论(0)
提交回复
热议问题