Rails:如何在最后之前找到记录?

时间:2011-08-10 17:18:28

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

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

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

4 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:20)

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

答案 2 :(得分:7)

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生成更优化的查询

答案 3 :(得分:0)

即使接受的答案有效:

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