Ответ 1
это работает (просто добавленный символ пробела для определения типа, поэтому: timestamp не отменяет его):
t.add_column :sometable, :created_at, 'timestamp '
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):
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote
(в Quoting#quoted_date
[при прохождении Time
] или Mysql2Adapter#quote_string
[при предварительном преобразовании to_s(:db)
]) на самом деле является наиболее потребляющим процессор секцией моего скребка. Я хочу избавиться от него.это работает (просто добавленный символ пробела для определения типа, поэтому: timestamp не отменяет его):
t.add_column :sometable, :created_at, 'timestamp '
Я довольно noobish, но я сделаю это. Что делать, если вы должны добавить свой собственный столбец или перезаписать стандартные? Вы можете использовать пользовательские типы данных с такой строкой:
t.add_column :mysql_timestamp, 'timestamp'
а затем где-то еще в вашей логике
def mysql_timestamp
Time.now.strftime("%Y-%m-%d %H:%M:%S")
end
Не уверен относительно b). Только один способ узнать!