2013-01-12 60 views
0

我想創建一個與last類似的方法second_to_last,但返回的是模型中倒數第二個記錄,而不是最後一條記錄。我認爲這將是微不足道的,因爲去年的SQL是:我將如何創建`second_to_last`方法?

Select * from "users".* FROM "Users" ORDERED BY "ORDERED BY" "users"."id" DECS LIMIT 1 

我必須找到一種方法來改變Limit 1Limit 2,然後選擇第一個元素。我的想法是否正確?有更好的方法嗎?

回答

2

,我認爲你是在正確的軌道上。嘗試這樣的:

User.order("created_at DESC").limit(2).last 

這應該返回倒數第二個記錄。

甚至有方法用你的新方法擴展Rails,但這可能超出了你的問題的範圍。

更好的是,您可以使用User.last(2)。我沒有比這更簡單。

3

如果這確實是一個rails問題,那麼無論如何您都不需要在SQL中執行它。只要做到:

User.order("id DESC").offset(1).first 

毫不誇張地說,它執行這個SQL查詢:

SELECT `users`.* FROM `users` ORDER BY id DESC LIMIT 1 OFFSET 1 
+0

我很想看到將生成的SQL。 –

+0

@theTinMan我在控制檯中運行它來檢查。看我的編輯。 – weltschmerz

+0

看起來它會根據':id'順序獲取表中的第二行,而不是OP所要求的倒數第二行。我看不到'ORDER BY'的'desc'修飾符來顛倒順序。 –