我有一个Rails 2.3.5应用程序,其中包含id和created_at列。这个表记录了实体的状态随时间的变化,所以我偶尔会用它来查找一个实体在特定时间的状态,方法是查找在该时间之前发生的状态变化,并根据时间戳created_at选择最新的状态变化。对于1445个实体中的10个,状态更改的时间戳与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 |
我可能可以通过排序id而不是时间戳来解决这个问题,但我想不出一个解释它是如何发生的。该应用程序使用几个杂种实例,但它们都在同一台机器上(Debian Lenny);我错过了什么明显的东西吗?
因为Rails使用数据库序列来获取id
字段的新id(至少在PostgreSQL中)在插入或RETURNING
关键字时,如果数据库支持它,
但是它在创建时使用ActiveRecord::Timestamp#create_with_timestamps
方法更新created_at
和updated_at
字段,这使用了系统时间。
1154
行是稍后插入的,但created_at
字段的时间戳是在之前计算的。