2012-02-10 12 views
11

Rails ':timestamp tipo de columna mentiras; en realidad es solo un alias para :datetime.Hacer ActiveRecord/Rails utilizar columnas mysql TIMESTAMP reales

Estoy usando mysql, y quiero utilizar las columnas de fecha y hora de unix TIMESTAMP.

a) ¿Hay una buena manera de configurar esto, además de solo hacer la columna con SQL?

b) ¿Actuará ActiveRecord correctamente (por ejemplo, convirtiendo a Time cuando sea necesario, aceptando una marca de tiempo unix Integer como entrada, etc.)? ¿Qué problemas debería esperar tener que manejar, y dónde?

qué:

  1. velocidad. Esto es para una tabla extremadamente activa que agrega fuentes de datos externas que ya usan marcas de tiempo de Unix. Convirtiendo a datetime (o incluso convirtiendo primero a una cadena de db, que pasa por 2 gsub s) consume la mayor parte de su tiempo de importación. De lo contrario, podría estar haciendo una llamada barata Integer#to_s.

  2. Timezones. No los quiero. Quiero que se almacene la zona horaria de forma independiente; tratar con zonas horarias es un problema y es completamente irrelevante para mis necesidades, excepto en la etapa final antes de la visualización individual del usuario. Los datos en sí no necesitan saber en qué zona horaria se registró.

  3. Tamaño. Es una mesa grande TIMESTAMP is half the size of DATETIME.

Sí, yo todavía estaría haciendo updated_at cálculos en el código, no MySQL. Esa parte no es un cuello de botella.

Por qué su 'por qué no' está mal (de forma preventiva, para mostrar que no estoy preguntando por razones noobish :-P):

  1. "pero las actualizaciones TIMESTAMP Auto": That's only true by default, and can be easily switched off.
  2. estoy en realidad no usa Rails, solo ActiveRecord.
  3. Sí, esto se basa en actual profiling data; No estoy optimizando temprano. ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote (en Quoting#quoted_date [si pasa Time] o Mysql2Adapter#quote_string [si preconvierte to_s(:db)]) es en realidad la sección que consume más CPU de mi raspador. Quiero deshacerme de eso.
+0

¿Por qué importaría si está utilizando rieles (# 2)? (Estoy usando Rails, pero considerando utilizar la marca de tiempo para ahorrar espacio) –

Respuesta

0

Soy bastante novato, pero lo intentaré. ¿Qué sucede si agregas tu propia columna personalizada o sobrescribes las predeterminadas? Puede utilizar los tipos de datos personalizados con una cadena de este modo:

t.add_column :mysql_timestamp, 'timestamp' 

y luego en otro lugar en la lógica

def mysql_timestamp 
    Time.now.strftime("%Y-%m-%d %H:%M:%S") 
end 

No estoy seguro de b). ¡Sólo hay una forma de averiguarlo!

+0

el tipo de columna 'timestamp' no es TIMESTAMP, es DATETIME. – Sai

+1

solo cuando es un símbolo. si usas una cadena, puede ser lo que quieras que sea, al menos, según @tadman en esta publicación http://stackoverflow.com/questions/4100209/ruby-rails-active-record-db-migration-to -mysql-timestamp-type # 4100341 No lo he probado. –

+0

@protolif no funciona como se describe. – aTei

7

esto funciona (espacio en blanco se agregó a escribir definición, por lo que: marca de tiempo que no anula):

 t.add_column :sometable, :created_at, 'timestamp '