2011-04-28 7 views
5

Tengo una aplicación Rails 2.3.5 con una tabla que contiene las columnas id y created_at. La tabla registra los cambios de estado en las entidades a lo largo del tiempo, así que de vez en cuando lo uso para buscar el estado de una entidad en un momento determinado, buscando cambios de estado que ocurrieron antes de la hora y seleccionando la más reciente de acuerdo con la marca de tiempo created_at. Para 10 de 1445 entidades, las marcas de tiempo de los cambios de estado están en un orden diferente al de los ID, y el estado del último cambio de estado difiere del estado que se almacena con la propia entidad, p.Rails created_at orden de la marca de tiempo no concuerda con la orden de identificación

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  | 

es probable que pueda evitar esto mediante el pedido de ID en lugar de marca de tiempo, pero no puedo pensar en una explicación de cómo pudo haber sucedido. La aplicación usa varias instancias de mongres, pero todas están en la misma máquina (Debian Lenny); ¿Me estoy perdiendo algo obvio? DB es Postgres.

Respuesta

4

Debido a que los carriles está utilizando database sequence a buscar a la nueva identificación para el campo id (al menos en PostgreSQL) en insert o con la palabra clave RETURNING si la base de datos lo soporta.

Pero actualiza los campos created_at y updated_at en crear con ActiveRecord::Timestamp#create_with_timestamps método que utiliza la hora del sistema.

La fila 1154 se insertó más tarde, pero la marca de tiempo para el campo created_at se calculó anteriormente.

+0

Gracias por la respuesta; Todavía estoy confundido sobre cómo podría suceder esto. Me refiero a que la marca de tiempo para 1154 es anterior al resto por al menos 21 segundos, sin embargo, su identificación, y el estado actual de la entidad (5) sugieren que fue el último en la secuencia. – Leo

+0

@Leo ¿Tienes una buena explicación para esto? '1154' realmente fue el último en el orden? –

Cuestiones relacionadas