Найти новейшую запись в Rails 3 - PullRequest
53 голосов
/ 02 февраля 2011

Мне было интересно, есть ли способ найти самую новую запись в таблице в rails3?

Спасибо

Эллиот

Ответы [ 5 ]

117 голосов
/ 02 февраля 2011

С учетом модели Post вы можете сделать @post = Post.order("created_at").last

(причина, по которой я не просто сделал @post = Post.last, заключается в том, что по умолчанию всегда выполняется сортировка по первичному ключу (обычно id)В большинстве случаев это нормально, но я уверен, что есть сценарий, в котором это может вызвать проблемы (например, установка пользовательских идентификаторов в записях, изменения базы данных, которые влияют на последовательность / автонумерацию первичного ключа и т. Д.). Сортировка по created_at отметка времени гарантирует, что вы действительно получите самую последнюю запись).

21 голосов
/ 03 февраля 2011

Несмотря на то, что ответ dmarkow технически верен, вам нужно будет создать указатель для созданного_ката или рискнуть все более медленным запросом по мере роста вашей базы данных.

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

Кроме того, если AREL не оптимизирован для выбора только одной записи в находке (: last), вы рискуете сделать так, чтобы он выбрал ВСЕ записи, а затем вернул вам только последнюю, используя метод last (). Более эффективным является ограничение результатов до одного:

MyModel.last(:order => "id asc", :limit => 1)

или

MyModel.first(:order => "id desc", :limit => 1)
3 голосов
/ 22 сентября 2012

Вы можете столкнуться с проблемами неоднозначности, используя created_at для таблицы с достаточно высоким трафиком.

например. попробовать:

INSERT INTO table (created_at) VALUES ( NOW() );
INSERT INTO table (created_at) VALUES ( NOW() );

.. потенциально может иметь тот же created_at, разрешение которого составляет всего 1 секунду. сортировка будет возвращать их в произвольном порядке.

может быть, вам лучше сохранить значение микровремени и отсортировать по нему.

2 голосов
/ 02 февраля 2011

Да, вы можете использовать метод .last

Так что, если ваша модель называется Post, то:

>> Post.last
=> #<Post ...>
1 голос
/ 02 февраля 2011

Попробуйте для модели с именем ModelName:

record = ModelName.last
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...