Найти самую новую запись в Rails 3


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

спасибо

Эллиот

5 51

5 ответов:

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

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

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

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

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

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

или

MyModel.first(:order => "id desc", :limit => 1)

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

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

>> Post.last
=> #<Post ...>

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

например. попробуйте:

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

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

возможно, вам лучше сохранить значение microtime и отсортировать его.

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

record = ModelName.last