Ruby on Rails: how do I sort with two columns using ActiveRecord?

前端 未结 7 1074
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-30 23:39

I want to sort by two columns, one is a DateTime (updated_at), and the other is a Decimal (Price)

I would like to be able to sort first by updated_at, t

相关标签:
7条回答
  • 2020-12-01 00:12

    Actually there are many ways to do it using Active Record. One that has not been mentioned above would be (in various formats, all valid):

    Model.order(foo: :asc).order(:bar => :desc).order(:etc)
    

    Maybe it's more verbose, but personally I find it easier to manage. SQL gets produced in one step only:

    SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC
    

    Thusly, for the original question:

    Model.order(:updated_at).order(:price)
    

    You need not declare data type, ActiveRecord does this smoothly, and so does your DB Engine

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

    In Rails 4 you can do something similar to:

    Model.order(foo: :asc, bar: :desc)
    

    foo and bar are columns in the db.

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

    Assuming you're using MySQL,

    Model.all(:order => 'DATE(updated_at), price')
    

    Note the distinction from the other answers. The updated_at column will be a full timestamp, so if you want to sort based on the day it was updated, you need to use a function to get just the date part from the timestamp. In MySQL, that is DATE().

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

    Active Record Query Interface lets you specify as many attributes as you want to order your query:

    models = Model.order(:date, :hour, price: :desc)
    

    or if you want to get more specific (thanks @zw963 ):

    models = Model.order(price: :desc, date: :desc, price: :asc) 
    

    Bonus: After the first query, you can chain other queries:

    models = models.where('date >= :date', date: Time.current.to_date)
    
    0 讨论(0)
  • 2020-12-01 00:22

    None of these worked for me! After exactly 2 days of looking top and bottom over the internet, I found a solution!!

    lets say you have many columns in the products table including: special_price and msrp. These are the two columns we are trying to sort with.

    Okay, First in your Model add this line:

    named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }
    

    Second, in the Product Controller, add where you need to perform the search:

    @search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
    
    0 讨论(0)
  • 2020-12-01 00:34
    Thing.find(:all, :order => "updated_at desc, price asc")
    

    will do the trick.

    Update:

    Thing.all.order("updated_at DESC, price ASC")
    

    is the Rails 3 way to go. (Thanks @cpursley)

    0 讨论(0)
提交回复
热议问题