使ActiveRecord / Rails使用实际的mysql TIMESTAMP列

Rails’ :timestamp列类型; 它实际上只是一个别名:datetime

我正在使用mysql,我想使用实际的unix-timestamp TIMESTAMP列。

a)有没有一种很好的方法来设置它,除了使用SQL创建列?

b)ActiveRecord是否会正确处理它(例如在必要时转换为Time ,接受unix时间戳Integer作为输入等)? 我应该期待得到什么,以及在哪里?

为什么:

  1. 速度。 这适用于聚合已使用unix时间戳的外部数据源的极其活跃的表。 转换为datetime(甚至首先转换为db字符串,通过2 gsub )会占用其大部分导入时间。 否则我可以做一个廉价的Integer#to_s调用。

  2. 时区。 我不想要他们。 我希望它存储时区 – 非常地存储; 处理时区是一种痛苦,除了在个人用户显示之前的最后阶段,与我的需求完全无关。 数据本身无需知道记录的时区。

  3. 尺寸。 这是一张大桌子。 TIMESTAMP的大小是DATETIME的一半。

是的,我仍然会在代码中进行updated_at计算,而不是mysql。 那部分不是瓶颈。

为什么你的’为什么不’是错的(先前说明,我不是要求出于无理由的原因:-P):

  1. “但TIMESTAMP自动更新”: 默认情况下这是唯一的,并且可以轻松关闭。
  2. 我实际上并没有使用Rails,只有ActiveRecord。
  3. 是的,这是基于实际的分析数据 ; 我不是在早期优化。 ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote (在Quoting#quoted_date [如果通过Time ]或Mysql2Adapter#quote_string [如果预转换为to_s(:db) ])实际上是我的刮刀中耗费CPU最多的部分。 我想摆脱它。

这工作(只是将空白字符添加到类型定义,所以:timestamp不会覆盖它):

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

我很吵,但我会试一试。 如果您要添加自己的自定义列或覆盖默认列,该怎么办? 您可以将自定义数据类型与字符串一起使用:

 t.add_column :mysql_timestamp, 'timestamp' 

然后在你的逻辑中的其他地方

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

关于b)不确定。 只有一种方法可以找到答案!