簡體   English   中英

Ruby on Rails:如何使用ActiveRecord對兩列進行排序?

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

我想按兩列排序,一列是DateTime( updated_at ),另一列是十進制(價格)

我希望能夠先使用updated_at進行排序,然后,如果同一天出現多個項目,則按價格排序。

在Rails 4中,你可以做類似的事情:

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

foobar是db中的列。

假設您正在使用MySQL,

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

請注意與其他答案的區別。 updated_at列將是一個完整的時間戳,因此如果要根據更新的日期進行排序,則需要使用函數從時間戳中獲取日期部分。 在MySQL中,即DATE()

Thing.find(:all, :order => "updated_at desc, price asc")

會做的。

更新:

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

是Rails 3的方法。 (謝謝@cpursley

Active Record Query Interface允許您指定要為查詢訂購的任意數量的屬性:

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

或者如果你想更具體(感謝@ zw963 ):

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

獎勵:在第一次查詢后,您可以鏈接其他查詢:

models = models.where('date >= :date', date: Time.current.to_date)

實際上有很多方法可以使用Active Record來實現。 上面沒有提到的將是(以各種格式,全部有效):

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

也許它更冗長,但我個人覺得它更容易管理。 SQL僅在一步中生成:

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

因此,對於原始問題:

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

您無需聲明數據類型,ActiveRecord可以順利地執行此操作,您的數據庫引擎也是如此

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

這些都不適合我! 在通過互聯網查看頂部和底部兩天后,我找到了解決方案!

假設您在products表中有許多列,包括:special_price和msrp。 這些是我們嘗試排序的兩列。

好的,首先在您的模型中添加以下行:

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

其次,在Product Controller中,添加執行搜索所需的位置:

@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM