При создании ActiveRecord/Rails используются фактические столбцы TIMESTAMP mysql

Rails ':timestamp тип столбца лежит; это фактически просто псевдоним для :datetime.

Я использую mysql, и я хочу использовать фактические столбцы unix-timestamp TIMESTAMP.

a) Есть ли хороший способ установить это, кроме как просто сделать столбец с помощью SQL?

b) Будет ли ActiveRecord справляться с ним должным образом (например, при необходимости преобразовать в Time, принимая временную метку unix Integer в качестве ввода и т.д.)? С чем я должен рассчитывать, и где?

Почему:

  • Скорость. Это для чрезвычайно активной таблицы, которая объединяет внешние источники данных, которые уже используют временные метки unix. Преобразование в datetime (или даже преобразование сначала в строку db, которая проходит через 2 gsub s), использует большую часть времени импорта. В противном случае я мог бы сделать просто дешевый вызов Integer#to_s.

  • Часовые пояса. Я не хочу их. Я хочу, чтобы он хранился в часовом поясе - агностически; работа с часовыми поясами - это боль и совершенно не имеет отношения к моим потребностям, за исключением самого последнего этапа перед индивидуальным отображением пользователя. Сама по себе информация не нуждается в том, чтобы узнать, в какой временной зоне она была записана.

  • Размер. Это большой стол. TIMESTAMP - это половина размера DATETIME.

Да, я бы делал вычисления updated_at в коде, а не в mysql. Эта часть не является узким местом.

Почему ваш "почему бы и нет" не прав (прежде всего, чтобы показать, что я не прошу причин noobish: -P):

  • "Но автоматическое обновление TIMESTAMP": Это только по умолчанию и может быть легко отключено.
  • На самом деле я не использую Rails, просто ActiveRecord.
  • Да, это основано на фактических данных профилирования; Я не буду рано оптимизировать. ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quoteQuoting#quoted_date [при прохождении Time] или Mysql2Adapter#quote_string [при предварительном преобразовании to_s(:db)]) на самом деле является наиболее потребляющим процессор секцией моего скребка. Я хочу избавиться от него.

Ответ 1

это работает (просто добавленный символ пробела для определения типа, поэтому: timestamp не отменяет его):

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

Ответ 2

Я довольно noobish, но я сделаю это. Что делать, если вы должны добавить свой собственный столбец или перезаписать стандартные? Вы можете использовать пользовательские типы данных с такой строкой:

t.add_column :mysql_timestamp, 'timestamp'

а затем где-то еще в вашей логике

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

Не уверен относительно b). Только один способ узнать!