什么是获得第n个记录的最佳方式?

时间:2014-03-24 21:26:56

标签: ruby-on-rails activerecord

我在这里看到:How to get last N records with activerecord?获得最后5条记录的最佳方法是SomeModel.last(5)。 获得第5个最后一个记录的最佳方法只有SomeModel.last(5).first还是其他的东西?

提前致谢!

3 个答案:

答案 0 :(得分:4)

您要找的是LIMITOFFSET的组合,并确保查询使用ORDER BY作为约束。这在PostgreSQL上有描述 - Queries: Limit and Offset documentation page

一个例子是:

irb> SomeModel.count
=> 35

irb> SomeModel.order(:id).reverse_order.limit(1).offset(4)
# SomeModel Load (0.7ms)  SELECT "some_models".* FROM "some_models" ORDER BY "some_models".id DESC LIMIT 1 OFFSET 4
=> #<ActiveRecord::Relation [#<SomeModel id: 31, name: "hello world", created_at: "2014-03-24 21:52:46", updated_at: "2014-03-24 21:52:46">]>

产生相同的结果(尽管是AR :: Relation):

irb> SomeModels.last(5).first
# SELECT "some_models".* FROM "some_models" ORDER BY "some_models"."id" DESC LIMIT 5
=> #<SomeModel id: 31, name: "hello world", created_at: "2014-03-24 21:52:46", updated_at: "2014-03-24 21:52:46">

不同之处在于,在前一个查询中,PostgreSQL会在内存中处理.reverse_order.limit.offset查询,并在返回结果之前适当地限制值。在后者中,PostgreSQL将返回5个结果,并使用#first限制Ruby中的值。

答案 1 :(得分:3)

您可以按相反顺序使用offset查询。例如,可以使用以下命令检索最后创建的第五个记录:

SomeModel.order("created_at DESC").offset(4).first

答案 2 :(得分:0)

获得第5个最后记录的最简单方法是使用fifth

SomeModel.order("created_at DESC").fifth
相关问题