2013-01-09 64 views
0

我想使用fresh_when last_modified: @conversations.maximum(:updated_at)進行分頁。但是,當@conversations位於第2頁時,即使該集合中有一條記錄,updated_at仍會返回爲nil選擇偏移量> 0的最大值返回零

irb(mail):001:0> conversations = conversations.paginate(page: 1) 
=> [10 conversations] 

irb(main):002:0> conversations.maximum(:updated_at) 
    (3.0ms) SELECT MAX(`inbox_conversations`.`updated_at`) AS max_id FROM `inbox_conversations` LIMIT 10 OFFSET 0 
=> 2013-01-09 05:12:10 UTC# Correct 

irb(main):003:0> conversations = conversations.paginate(page: 2) 
=> [10 conversations] 

irb(main):004:0> conversations.maximum(:updated_at) 
    (2.7ms) SELECT MAX(`inbox_conversations`.`updated_at`) AS max_id FROM `inbox_conversations` LIMIT 10 OFFSET 10 
=> nil # Not correct 
+0

左連接需要我tnk –

+0

左連接和內連接沒有區別。 – maletor

+0

您正在從11-20中提取結果在那個位置有任何數據 –

回答

2

Rails正在曲解你想要什麼

SELECT MAX(`inbox_conversations`.`updated_at`) AS max_id FROM `inbox_conversations` LIMIT 10 OFFSET 10 

方式運行查詢,然後採取從偏移10.這將返回零,因爲結果集有單排前10個結果 - 最大的updated_at 。你想要的是偏移限制來影響計算最大值的行。

你可以用子查詢來做到這一點,但我只是用ruby來做這個計算,因爲無論如何你都要使用常規的Enunerable方法加載行。類似於

conversations.map(&:updated_at).max 
+0

在這種情況下,我無需加載行。使用'fresh_when'作爲唯一的查詢,我永遠不需要加載其餘的行。如何使用'ORDER BY updated desc'和'OFFSET'和'LIMIT 1'。這會達到相同的結果,並且比獲得全部十個更快,不是嗎? – maletor

+0

那麼你只需要加載行,如果etag實際上是新鮮的。但是,在那種情況下,這可能會更快 –

1

SQL MAX查詢不OFFSET(plain SQL workaround

工作有什麼ActiveRecord的.offset(n).maximum(:field)給出零如果n > 0

嘗試使用Ruby明文作爲一種解決方法(它可以節省您提前一個查詢) 。

conversations.max_by(&:updated_at)