2012-03-20 3 views
4

У меня есть отношение ActiveRecord между Trade и Execution. Я могу получитьАктивные записи. Model.Find.last

Trade.executions #returns all exeuctions realated to the Trade 

Если я

Trade.executions.last 

Кажется, кажется, возвращает последнюю запись исполнения на основе кода.

Это правильный способ получить последнюю запись выполнения, связанную с Trade на основе ID?

ответ

11

Нет, это не гарантирует, что вы совершите с самым высоким 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, поэтому используйте то, что вам больше всего подходит.

+2

+1, Вы можете добавить ': параметр order' в' executions ', то есть' has_many: executions,: order => "executions.created_at" ', таким образом' trade.executions.last' возвращает последнее выполнение на основе 'timestamp', а не' id'. –

+0

@ KandadaBoggu: правда, но я предпочитаю минимальные ассоциации, чтобы избежать ненужных ORDER BY и 'reorder's. –

+0

Насколько я понимаю, я использую этот подход в очень редких случаях, когда чрезмерная сортировка по умолчанию делает ассоциацию интуитивной. –

1

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

Это как в documentation и code

Как @muistooshort упоминалось, это не больно, чтобы быть явным :)