Ответ 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
Я могу найти последнюю запись в моей таблице, как в примере ниже, но что, если я хочу найти запись до последней, например. (последний-1) или (последний-2)..? У меня есть этот пример в каждом цикле:
Table.find(:last, :conditions => {:dogovor_id => p.id}).id
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
Еще один способ запоминания: Model.last(2).first
Рельсы 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.
Даже если принятые ответы работают:
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