2010-07-26 5 views
5

Me he ejecutado con un problema que creo que es un error de Active Records. Estoy analizando un archivo XML que contiene trabajos. Este archivo xml contiene nodos que indican el tiempo de la pared en el formato de hora 00:00:00. También tengo un modelo que aceptará estos trabajos. Sin embargo, cuando el tiempo es mayor que un tiempo real de 24 H, el registro activo lo inserta como NULL. Ejemplos a continuación:Insertar tiempo en una columna de tiempo con Ruby on Rails

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', 'NULL') 

INSERT INTO `jobs` (`jobid`, `walltime`) VALUES('71413', '15:24:10') 

¿Alguna idea? ¡Gracias!

+0

¿cuál es su problema haga el favor de explicar en detalle? Da error o algo? – Salil

+0

¿Está 'walltime' en su base de datos configurado para aceptar varchar o texto? ¿O es algún tipo de tiempo con formato mágico? (Si esta fuera mi aplicación, almacenaría el número de segundos como un número entero en la base de datos, y dejaré el formateo hasta la vista.) – sarnold

+1

¿En qué base de datos se ejecuta? Si es MySQL y el atributo walltime es del tipo Time, podría ser una captura interesante, ya que MySQL puede manejar el tiempo transcurrido a través del tipo Time y en ese caso ActiveRecord no debe convertir el atributo walltime a NULL. –

Respuesta

5

estándar SQL time y datetime tipos de datos no están destinados a almacenar una duración. Probablemente de acuerdo con esos estándares, ActiveRecord's time attribute assignment logic usa el time parsing rules of the native Ruby Time class para rechazar la hora del día no válida.

La manera de almacenar duraciones, ya que usted tiene la intención, es o bien:

  1. tienda la duración como un entero (por ejemplo, "número de segundos"), o
  2. tienda dos veces (fecha), una inicio y final, y use aritmética de fecha en ellos.
class Thing < ActiveRecord::Base 
    ... 
    def duration 
    return start - end 
    end 

    def duration=(length) 
    start = Time.now 
    end = start + length 
    end 
    ... 
end 
+1

Este no es el caso de MySQl (no sé sobre otras implementaciones). Vea aquí: http://dev.mysql.com/doc/refman/5.0/en/time.html ("... los valores pueden variar de '-838: 59: 59' a '838: 59: 59'. La parte de horas puede ser tan grande porque el tipo de TIEMPO se puede usar no solo para representar una hora del día (que debe ser inferior a 24 horas), sino también un tiempo transcurrido o un intervalo de tiempo entre dos eventos (que puede ser mucho mayor que 24 horas, o incluso negativo). ") –

+0

Hola Milán - sí, MySql puede admitir el almacenamiento de duración en una columna de tiempo - pero como Active Record está destinado a ser compatible con cross-db, aún puede interpretar" amablemente "la hora como un tiempo de reloj solamente. Por lo tanto, continuaría anulando cualquier cosa que vea como un "tiempo inválido". Por lo tanto, la opción de duración aquí es probablemente una mejor apuesta para garantizar que realmente funcione. –

+1

@Taryn Según nuestras sospechas, encontré el código que hace exactamente eso. –