2011-04-28 2 views
5

У меня есть приложение Rails 2.3.5 с таблицей, содержащей столбцы id и created_at. Таблица фиксирует изменения состояния для сущностей с течением времени, поэтому я иногда использую его для поиска состояния объекта в определенное время, путем поиска изменений состояния, которые произошли до времени, и выбора последнего в соответствии с меткой времени created_at. Для 10 из 1445 объектов временные метки изменений состояния находятся в другом порядке по идентификаторам, а состояние последнего изменения состояния отличается от состояния, которое хранится с самим объектом, например.Rails created_at timestamp order не согласен с порядком id

id |  created_at  | entity_id | state | 
------+---------------------+-----------+-------+ 
1151 | 2009-01-26 10:27:02 | 219  | 1  | 
1152 | 2009-01-26 10:27:11 | 219  | 2  | 
1153 | 2009-01-26 10:27:17 | 219  | 4  | 
1154 | 2009-01-26 10:26:41 | 219  | 5  | 

я, вероятно, могу обойти эту проблему, заказав по идентификатору вместо времени, но не могу придумать объяснение того, как это могло произойти. Приложение использует несколько экземпляров mongrel, но все они находятся на одной машине (Debian Lenny); я пропущу что-то очевидное? DB - Postgres.

ответ

4

, потому что Rails использует database sequence, чтобы принести новый идентификатор для id поля (по крайней мере, в PostgreSQL) на insert или с RETURNING ключевого слова, если база данных поддерживает его.

Но он обновляет поля created_at и updated_at при создании с использованием метода ActiveRecord::Timestamp#create_with_timestamps, который использует системное время.

Строка 1154 была вставлена ​​позже, но ранее была рассчитана отметка времени для поля created_at.

+0

Спасибо за ответ; Я все еще смущен тем, как это может произойти - я имею в виду, что временная метка для 1154 раньше, чем остальные, по меньшей мере на 21 секунду, но ее идентификатор и текущее состояние объекта (5) предполагают, что он пришел последним в последовательности. – Leo

+0

@Leo У вас есть хорошее объяснение этому? '1154' действительно пришел последним в заказе? –

Смежные вопросы