私は列のデータを失うことなくこのunixタイムスタンプをdatetimeフィールドに変換する方法を見つけたいので、現在列データ型が整数でデータがunixタイムスタンプとして保存されています。 Railsの移行で列を整数から日時に変更する方法はありますか?
class ChangeRecordTimeToDatetime < ActiveRecord::Migration
def up
as = Audio.all.map {|a| {id: a.id, record_time: Time.at(a.record_time)}}
Audio.all.update_all("record_time = NULL")
change_column :audios, :record_time, :datetime
as.map {|a| Audio.find(a[:id]).update(record_time: a[:record_time])}
end
def down
as = Audio.all.map {|a| {id: a.id, record_time: a.record_time.to_i}}
Audio.all.update_all("record_time = NULL")
change_column :audios, :record_time, :integer
as.map {|a| Audio.find(a[:id]).update(record_time: a[:record_time])}
end
end
を、これは私に事前にこの
Mysql2::Error: Incorrect datetime value: '1493178889' for column 'record_time' at row 1: ALTER TABLE `audios` CHANGE `record_time` `record_time` datetime DEFAULT NULL
おかげのようなエラーがスローされます:今、次のように私は、移行ファイルを作成しました。
UNIXタイムスタンプを挿入する前に、UNIXタイムスタンプをDateTimeオブジェクトに変換する必要があります。 'DateTime.strptime(" 1493178889 "、 '%s')' –
ありがとう、現在私は 'Time.at(1493178889)'を使っていますが、 'DateTime.strptime(" 1493178889 "、 '%s')'と 'Time.at(1493178889)'を使ってください。 –
'DateTime.strptime'は' DateTime'オブジェクトを返します。 'Time.at'は' Time'を返します。あなたの列は 'DATETIME'なので、可能であればRubyの' DateTime'を使いたいと思うでしょう。 –