【发布时间】: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
我可以在我的表中找到最后一条记录,如下例所示,但是如果我想在最后一条之前找到记录怎么办,例如(last-1) 或 (last-2)..? 我的每个循环都有这个例子:
Table.find(:last, :conditions => {:dogovor_id => p.id}).id
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3
另一种更容易记住的方式是:Model.last(2).first
【讨论】:
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
【讨论】:
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 生成更优化的查询
【讨论】:
Model.all[-2] 不限制从数据库加载的内容,而second_to_last 正确地将OFFSET 和LIMIT 放入 SQL 中。如果您有很多记录,那可能会非常有问题。
即使接受的答案有效:
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 返回包装在数组中的单个记录,实际上性能较差。
我们可以使用:
Model.last(2).first
或 我们写的很简单,它只适用于最后第三条记录。
Model.second_to_last
【讨论】: