使ActiveRecord / Rails使用实际的mysql TIMESTAMP列
Rails’ :timestamp
列类型; 它实际上只是一个别名:datetime
。
我正在使用mysql,我想使用实际的unix-timestamp TIMESTAMP
列。
a)有没有一种很好的方法来设置它,除了使用SQL创建列?
b)ActiveRecord是否会正确处理它(例如在必要时转换为Time
,接受unix时间戳Integer
作为输入等)? 我应该期待得到什么,以及在哪里?
为什么:
-
速度。 这适用于聚合已使用unix时间戳的外部数据源的极其活跃的表。 转换为datetime(甚至首先转换为db字符串,通过2
gsub
)会占用其大部分导入时间。 否则我可以做一个廉价的Integer#to_s
调用。 -
时区。 我不想要他们。 我希望它存储时区 – 非常地存储; 处理时区是一种痛苦,除了在个人用户显示之前的最后阶段,与我的需求完全无关。 数据本身无需知道记录的时区。
-
尺寸。 这是一张大桌子。 TIMESTAMP的大小是DATETIME的一半。
是的,我仍然会在代码中进行updated_at
计算,而不是mysql。 那部分不是瓶颈。
为什么你的’为什么不’是错的(先前说明,我不是要求出于无理由的原因:-P):
- “但TIMESTAMP自动更新”: 默认情况下这是唯一的,并且可以轻松关闭。
- 我实际上并没有使用Rails,只有ActiveRecord。
- 是的,这是基于实际的分析数据 ; 我不是在早期优化。
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)不确定。 只有一种方法可以找到答案!