我想将fresh_when last_modified: @conversations.maximum(:updated_at)
用于分页。但是,当@conversations
位于第2页时,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
答案 0 :(得分:2)
Rails误解了你想要的东西
SELECT MAX(`inbox_conversations`.`updated_at`) AS max_id FROM `inbox_conversations` LIMIT 10 OFFSET 10
表示运行查询,然后从偏移量10中获取前10个结果。返回nil,因为结果集有一行 - 最大updated_at。您想要的是影响计算最大值的行的偏移限制。
您可以使用子查询执行此操作,但我只是在ruby中执行此计算,因为您无论如何都要使用常规Enunerable
方法加载行。像
conversations.map(&:updated_at).max
答案 1 :(得分:1)
SQL MAX查询不适用于OFFSET(plain SQL workaround)
如果.offset(n).maximum(:field)
n > 0
都会为nil
尝试使用纯Ruby作为解决方法(它可以提前为您保存查询)。
conversations.max_by(&:updated_at)