选择带偏移的最大值> 0返回nil

时间:2013-01-09 06:37:18

标签: mysql sql ruby-on-rails ruby ruby-on-rails-3

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

2 个答案:

答案 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)

,则任何ActiveRecord n > 0都会为nil

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

conversations.max_by(&:updated_at)