2014-02-07 38 views
0

我有這樣的代碼來獲得每一條記錄的位置:行位置

Message.all.each_with_index do |msg, i| 
    message_order[msg.id] = i 
end 

但現在我有100K +的消息,它需要長期在遍歷所有記錄。 誰能告訴我如何做到這一點更高性能? (我正在使用oracle)

我想到了rownum,但沒有找到解決方案。 一個只返回一個消息位置的解決方案會很棒。

回答

1

我不知道如果我明白你的問題。

如果需要與指定的訂單ID的消息(例如:5),可以執行類似的操作:

SELECT message 
FROM (SELECT message, ROWNUM AS ID 
     FROM (SELECT message 
      FROM tab1 
      ORDER BY some_date)) 
WHERE ID = 5; 

或者,使用分析函數:

SELECT message 
FROM (SELECT message, 
      ROW_NUMBER() OVER(ORDER BY some_date) AS ID 
     FROM tab1) 
WHERE ID = 5; 
+0

謝謝,就是這樣:) –

0

這應該工作:

Message.where("id < :id", id: msg.id).count 
+0

這些消息AREN」 t訂購編號 –

+0

那麼,你可以添加訂單(another_field),並更改「other_field