Заставить ActiveRecord / Rails использовать фактические столбцы TIMESTAMP mysql - PullRequest
11 голосов
/ 10 февраля 2012

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

Я использую mysql и хочу использовать фактическую отметку времени Unix TIMESTAMP столбцов.

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

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

Почему:

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

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

  3. Размер. Это большой стол. TIMESTAMP вдвое меньше DATETIME.

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

Почему ваше «почему бы и нет» неверно (предварительно, чтобы показать, что я не спрашиваю по нубистским причинам :-P):

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

Ответы [ 2 ]

7 голосов
/ 04 декабря 2012

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

     t.add_column :sometable, :created_at, 'timestamp '
0 голосов
/ 28 февраля 2012

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

t.add_column :mysql_timestamp, 'timestamp'

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...