2011-04-28 35 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

相關問題