簡體   English   中英

Ruby on Rails排序方式:created_at或updated_at(以較新的為准)

[英]Sort by either created_at or updated_at (whichever is more recent) Ruby on Rails

我遇到了一個簡單的問題,只是我似乎找不到答案。

我有一組記錄:

@mymonkeys = @user.monkeys.all

我需要的是最近與之交互(創建或更新)的3只猴子。

我可以像這樣獲得最近創建的猴子: @mymonkeys.sort_by(&:created_at).reverse!.take(3)

最近更新的猴子是這樣的: @mymonkeys.sort_by(&:updated_at).reverse!.take(3)

但是,是否有一行代碼可以返回最近創建或更新的猴子?

非常感謝!



PS:我看到了提到coalesce關鍵字的問題 ,但是我無法確定這是否是我想要的。

&:created_at{ |monkey| moneky.created_at } { |monkey| moneky.created_at } 傳遞您要執行的操作的塊。

@mymonkeys.sort_by { |m| [m.created_at, m.updated_at].max }.reverse!.take(3)

您可以(可能應該)在數據庫中執行此操作,但COALESCE並不是您想要的。 COALESCE用於將NULL轉換為SQL中的其他內容,您可以這樣說:

coalesce(might_be_null, what_i_want_instead_of_null)

對於您的情況,應該始終同時具有created_atupdated_at因此您不必擔心NULL。

如果要選擇多個值中的最大值, 則要使用GREATEST 如果要最小,則使用LEAST; 任何值得用於實際工作的數據庫都應同時支持GREATEST和LEAST,但如有必要,您可以使用CASE進行偽造。 最近的時間戳記是GREATEST,因此您想按greatest(created_at, update_at)進行排序; 您還希望將最近的三個放在列表的頂部,因此您想要一個降序排序(即最大的排序); 您可以在數據庫中向數據庫發送LIMIT 3。 那給你:

three_recent_monkeys = @user.monkeys.order('greatest(created_at, updated_at) desc').limit(3)

這是Rails,因此updated_at應該始終至少為created_at因此greatest(created_at, updated_at)應該始終為updated_at 這意味着您可以簡化事情,只需說:

three_recent_monkeys = @user.monkeys.order('updated_at desc').limit(3)

暫無
暫無

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

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