2016-06-27 68 views
0

我有一組用戶。他們有很多要求。相關模型中屬性的高級排序

# user.rb 
has_many :requests 

現在我想通過最後要求created_at時間戳對它們進行排序。

所以,如果用戶有最近的請求(就是created_at最接近當前時間)他們是#1等

任何想法?

我已經試過

User.includes(:requests).order('requests.created_at') 

然而,通過第一個請求created_at時間戳這顯然不是我想要的排序。我只想檢索他們的最後一個請求。然後根據他們在日期創建的用戶上次請求進行排序,然後按用戶排序。

更新: 另外,如果用戶沒有任何請求,他們應該在底部。現在,如果他們沒有任何東西,他們會置於頂端。

回答

0
User.joins(:requests).includes(:requests).order('requests.created_at desc') 

你需要joins它,所以它會排序的連接表。

includes只會爲您預加載您的requests,它不會幫助您對requests進行排序。

UPDATE

借用SQL how to make null values

要納入這種情況下,它可能看起來像這樣

User.joins(:requests).includes(:requests).order('CASE WHEN requests.created_at IS NULL THEN 1 ELSE 0 END asc, requests.created_at desc') 

一階會把空者在底部,然後按日期排序d esc

+0

有關我如何對其進行排序以便也沒有任何請求的用戶最後的任何想法?目前他們是第一位的。 –

+0

@ SebastianJenningsAlmnes更新,給它一個鏡頭 – lusketeer

1

您必須按降序排列。嘗試

User.includes(:requests).order('requests.created_at desc').first()