【问题标题】:Whats the best way to get the nth to last record?获得倒数第 n 个记录的最佳方法是什么?
【发布时间】:2023-03-15 04:14:01
【问题描述】:

我在这里看到:How to get last N records with activerecord? 获取最后 5 条记录的最佳方法是 SomeModel.last(5)。 获得最后第五条记录的最佳方法是 SomeModel.last(5).first 还是别的什么?

提前致谢!

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    获取倒数第 5 条记录的最简单方法是结合降序排序和fifth:

    SomeModel.order("created_at DESC").fifth
    

    【讨论】:

      【解决方案2】:

      您可以将offset 与查询相反的顺序使用。例如,可以通过以下方式检索最后创建的第五条记录:

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

      【讨论】:

      • 这不是让我得到相同的元素:User.count #=> 11User.order('created_at DESC').offset(5).first.id #=> 6User.last(5).first.id #=> 7。我做错了吗??
      • 不,你做得对@raviolicode use offset to specify the number of records to skip before starting to return the records。它会跳过最后5条记录,实际上应该是offset(4)
      • @liamneesonsarmsauce, raviolicode:谢谢,我修正了答案。
      【解决方案3】:

      您要查找的是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 中的值。

      【讨论】:

        猜你喜欢
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多