Порядок создания меток времени в Rails не соответствует порядку идентификатора - PullRequest
6 голосов
/ 28 апреля 2011

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

  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     | 

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

1 Ответ

5 голосов
/ 28 апреля 2011

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

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

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

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