我有一个Rails 2.3.5应用程序,其中包含一个包含id和created_at列的表。该表记录了实体随时间的状态变化,因此我偶尔会使用它来查找特定时间的实体状态,方法是查找在该时间之前发生的状态更改,并根据created_at时间戳选择最新的状态。 对于1445个实体中的10个,状态变化的时间戳与ids的顺序不同,并且最后一个状态变化的状态与实体本身存储的状态不同,例如。
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);我错过了一些明显的东西吗DB是Postgres。
答案 0 :(得分:5)
因为Rails使用database sequence在insert上为id
字段(至少在PostgreSQL中)获取新ID,或者如果数据库支持,则使用RETURNING
关键字它
但它会使用ActiveRecord::Timestamp#create_with_timestamps
方法更新创建的created_at
和updated_at
字段,该方法使用系统时间。
稍后插入了行1154
,但之前计算了created_at
字段的时间戳。