0

我想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
4

2 回答 2

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
于 2013-01-09T07:25:51.130 回答
1

SQL MAX 查询不适用于 OFFSET(普通 SQL 解决方法

如果任何 ActiveRecord.offset(n).maximum(:field)给出 niln > 0

尝试使用纯 Ruby 作为解决方法(它可以提前为您节省查询)。

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