2016-07-13 80 views
1

我以db的形式存儲用戶消息。我需要查詢最後10條記錄,並以相反順序返回它們,因此假設用戶創建了message_1,message_2和message_3。我想要按如下順序排列結果:[message_1, message_2, message_3],即最後的消息是最後的結果。但是這個範圍:以反向順序查詢N個最後記錄,範圍爲

scope :last_page, ->() { order('created_at DESC').limit(10) 

返回記錄如[message_3, message_2, message_1],即最後一條消息在最上面。

我已經試過是:

scope :last_page, ->() { order('created_at DESC').limit(10).sort_by(&:created_at) } 

產生期望的結果,而是返回數組,而不是ActiveRecord::Relation。我喜歡範圍返回關係而不是數組。我怎樣才能做到這一點?

+1

不能使用的範圍內'sort_by'。範圍是鏈接併爲您構建SQL。 'sort_by'是Ruby可枚舉的方法,用於處理內存中的數據。你需要應用一些其他的技巧 –

+0

完全正確。我會問你爲什麼要排序? '命令'('...')'是否照顧這個? – jaydel

回答

1

order('created_at DESC')會給你最新的(或上次)作爲第一或只是一個降序。您需要結合order('created_at ASC')last。下面的代碼應該可以工作。

scope :last_page, ->() { order('created_at ASC').last(10) 

scope :last_page, ->() { order('created_at').last(10) 
+0

是否會返回結果數組或ActiveRecord :: Relation?我想知道你是否甚至可以從範圍中獲得關係。不確定。 – jaydel

+1

@jaydel所有作用域方法都會返回一個'ActiveRecord :: Relation'對象。 – Pavan

+0

很酷,謝謝。我的下一個問題是,是last()在'ActiveRecord :: Relation'還是'Array' /'Enumerable'方法? – jaydel

相關問題