0

ページネーションで使いたいfresh_when last_modified: @conversations.maximum(:updated_at)です。ただし、@conversationsが 2 ページにある場合は、セットにレコードが 1 つある場合でも、 がupdated_at返されます。nil

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
4

2 に答える 2

2

Railsはあなたが望むものを誤解しています

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

クエリを実行し、オフセット 10 から最初の 10 個の結果を取得することを意味します。結果セットには単一の行 (最大の updated_at) があるため、これは nil を返します。代わりに、最大値が計算された行に影響を与えるオフセット制限が必要でした。

Enunerableサブクエリでこれを行うこともできますが、通常の方法を使用してとにかく行をロードしているため、この計算はルビーで行うだけです。何かのようなもの

conversations.map(&:updated_at).max
于 2013-01-09T07:25:51.130 に答える
1

SQL MAX クエリが OFFSET で機能しない (プレーン SQL の回避策)

次の場合、すべての ActiveRecord.offset(n).maximum(:field)は nil を返しますn > 0

回避策としてプレーン Ruby を使用してみてください (事前にクエリを節約できます)。

conversations.max_by(&:updated_at)
于 2013-01-09T07:20:23.607 に答える