Rails: как найти запись до последнего?

Я могу найти последнюю запись в моей таблице, как в примере ниже, но что, если я хочу найти запись до последней, например. (последний-1) или (последний-2)..? У меня есть этот пример в каждом цикле:

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

Ответ 1

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

Ответ 2

Еще один способ запоминания: Model.last(2).first

Ответ 3

Рельсы 4:

Model.last(2).first

В Rails 5 вы можете использовать новые очевидные методы доступа:

Model.second_to_last
Model.third_to_last

Вы также можете использовать отрицательные показатели.

Предпоследний:

Model.all[-2]

Десятый до последнего:

Model.all[-10]

NB. Как указывает @AndrewSchwartz, этот метод может быть более проблематичным (потребляющим) для больших таблиц. Этот метод сначала загружает все записи, а затем обрабатывает их, тогда как second_to_last создает более оптимизированный запрос с LIMIT и OFFSET.

Ответ 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

"первый" метод - метод массива, поэтому в отношении производительности лучше использовать метод "limit", который является методом ActiveRecord и привязывает предложение LIMIT к SQL-запросу:

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