2011-04-28 76 views
5

我有一个Rails 2.3.5应用程序,其中包含一个包含id和created_at列的表。该表随着时间的推移记录对实体的状态更改,因此我偶尔会使用它在特定时间查看实体的状态,方法是查找时间之前发生的状态更改,然后根据created_at时间戳选择最新状态。 对于1445个实体中的10个,状态改变的时间戳与ID不同,并且最后状态改变的状态不同于实体自身存储的状态,例如,Rails created_at时间戳顺序不符合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);我错过了明显的东西吗? DB是Postgres。

回答

4

由于Rails使用database sequence如果数据库支持的话就insert或与RETURNING关键字获取新的ID(至少在PostgreSQL的)你id场。

但它更新created_atupdated_at创建的字段使用系统时间的ActiveRecord::Timestamp#create_with_timestamps方法。

稍后插入行1154,但之前计算的是created_at字段的时间戳。

+0

感谢您的回答;我仍然对这种情况如何发生感到困惑 - 我的意思是1154的时间戳比其他时间早了21秒,但是它的ID和实体的当前状态(5)表明它们是序列中的最后一个。 – Leo 2011-05-04 16:25:41

+0

@Leo你对此有一个很好的解释吗? “1154”真的是最后的顺序? – 2015-05-16 17:42:19