2011-04-28 20 views
5

私は、idとcreated_atの列を含むテーブルを持つRails 2.3.5アプリを持っています。テーブルは時間の経過とともにエンティティの状態変化を記録するので、特定の時刻のエンティティの状態を調べたり、その前に発生した状態の変化を調べたり、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はデータベースがサポートしている場合insertRETURNINGキーワードで(少なくともPostgreSQLの)あなたのidフィールドに新しいIDを取得するためにdatabase sequenceを使用しています。

しかし、created_atupdated_atフィールドは、作成時にシステム時刻を使用するActiveRecord::Timestamp#create_with_timestampsメソッドで更新されます。

1154は後で挿入されましたが、created_atフィールドのタイムスタンプは前に計算されました。

+0

回答ありがとうございます。私はまだこれがどう起こるのか混乱しています。つまり、1154のタイムスタンプが他のものよりも少なくとも21秒早いですが、そのIDとエンティティの現在の状態(5)は、シーケンスの最後に来ることを示唆しています。 – Leo

+0

@Leoあなたはこれについて良い説明をしましたか? 1154は本当に最後に来たの? –