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

Sai*_*Sai 11 mysql activerecord timestamp ruby-on-rails

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的部分.我想摆脱它.

mer*_*tta 7

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

     t.add_column :sometable, :created_at, 'timestamp '
Run Code Online (Sandbox Code Playgroud)


小智 0

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

t.add_column :mysql_timestamp, 'timestamp'
Run Code Online (Sandbox Code Playgroud)

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

def mysql_timestamp
  Time.now.strftime("%Y-%m-%d %H:%M:%S")
end
Run Code Online (Sandbox Code Playgroud)

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