Активная запись. Model.Find.last - PullRequest
4 голосов
/ 20 марта 2012

У меня есть отношение ActiveRecord между Trade и Execution.Я могу получить

Trade.executions  #returns all exeuctions realated to the Trade

Если я сделаю

Trade.executions.last

Похоже, что возвращает последнюю запись выполнения на основе идентификатора.

Это правильный способ полученияпоследняя запись исполнения, относящаяся к сделке на основе идентификатора?

Ответы [ 2 ]

12 голосов
/ 20 марта 2012

Нет, это не гарантирует вам выполнение с самым высоким id. Если вы не укажете явный порядок, то записи могут выходить из базы данных в любом порядке. Тот факт, что они выглядят так, как будто они отсортированы по id, просто удобная случайность.

Вы должны сделать одно из следующих действий:

highest_id_execution = trade.executions.order(:id).last
highest_id_execution = trade.executions.order('id desc').first

Это даст вам исполнение для trade с самым высоким id. Если вы действительно хотите самый последний созданный, вам следует вместо этого order(:created_at):

most_recent_execution = trade.executions.order(:created_at).last
most_recent_execution = trade.executions.order('created_at desc').first

Столбцы id и created_at почти всегда располагаются в одном и том же порядке, но вы должны сказать, что вы имеете в виду, чтобы разъяснить людям, которые поддерживают ваш код.

В обоих случаях order(:x).last и order('x desc').first абсолютно одинаковы и даже разрешают в точности один и тот же SQL, так что используйте тот, который вам наиболее подходит.

1 голос
/ 14 мая 2015

#last вернет последнюю запись на основе первичного ключа. Если ваш первичный ключ не id, то вам нужно быть более явным.

Это и в документации , и в коде

Как уже упоминалось @muistooshort, явное указание не повредит:)

...