【问题标题】:Rails: how to find record before last?Rails:如何找到前一个记录?
【发布时间】:2011-08-10 17:18:28
【问题描述】:

我可以在我的表中找到最后一条记录,如下例所示,但是如果我想在最后一条之前找到记录怎么办,例如(last-1) 或 (last-2)..? 我的每个循环都有这个例子:

Table.find(:last, :conditions => {:dogovor_id => p.id}).id

【问题讨论】:

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


    【解决方案1】:

    另一种更容易记住的方式是:Model.last(2).first

    【讨论】:

      【解决方案2】:
      Table.where(:dogovor_id => p.id).order("id DESC").first           # last
      Table.where(:dogovor_id => p.id).order("id DESC").offset(1).first # last - 1
      Table.where(:dogovor_id => p.id).order("id DESC").offset(2).first # last - 2
      

      【讨论】:

        【解决方案3】:

        Rails 4:

        Model.last(2).first
        

        Rails 5+ 中,您可以使用新的不言自明的accessor methods

        Model.second_to_last
        Model.third_to_last
        

        您也可以使用负索引。

        倒数第二个:

        Model.all[-2]
        

        倒数第10位:

        Model.all[-10]
        

        NB:正如@AndrewSchwartz 所指出的,这种方法在大型表上可能会出现更多问题(消耗)。此方法首先加载所有记录,然后处理它们,而second_to_last 使用 LIMIT 和 OFFSET 生成更优化的查询

        【讨论】:

        • 根据我的 SQL 日志,Model.all[-2] 不限制从数据库加载的内容,而second_to_last 正确地将OFFSETLIMIT 放入 SQL 中。如果您有很多记录,那可能会非常有问题。
        • 还有其他人,我敢打赌,not well-known methods
        【解决方案4】:

        即使接受的答案有效:

        Table.where(:dogovor_id => p.id).order("id DESC").first           # last
        Table.where(:dogovor_id => p.id).order("id DESC").offset(1).first # last - 1
        Table.where(:dogovor_id => p.id).order("id DESC").offset(2).first # last - 2
        

        'first' 方法是一个数组方法,所以关于性能最好使用'limit' 方法,它是一个 ActiveRecord 方法并将 LIMIT 子句附加到 SQL 查询:

        Table.where(dogovor_id: p.id).order(id: :desc).offset(1).limit(1) # last - 1
        

        【讨论】:

        • first 也是一个 ActiveRecord 方法,它附加了LIMIT。使用first 返回单个记录,而使用limit 返回包装在数组中的单个记录,实际上性能较差。
        【解决方案5】:

        我们可以使用:

        Model.last(2).first
        

        或 我们写的很简单,它只适用于最后第三条记录。

        Model.second_to_last
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-30
          • 1970-01-01
          • 2012-01-29
          • 1970-01-01
          相关资源
          最近更新 更多