我想将所有非日期格式的字符串更改为日期为nil,然后更改列类型。我曾计划使用以下内容:
class SetSubmitDateForAllMyTables < ActiveRecord::Migration
def self.up
MyTable.connection.execute("UPDATE my_table SET submit_date = NULL WHERE NOT ISDATE(submit_date)")
MyTable.connection.execute("UPDATE my_table SET submit_date=created_at WHERE submit_date IS NULL")
change_column :my_table, :submit_date, :date
end
def self.down
end
end
然而,ISDATE函数似乎在POSTGRES中无效。我怎么能做到这一点?
我愿意使用:
MyTable.all.each do |list|
答案 0 :(得分:0)
Postgresql可以强制执行字符串到日期,但它会在无效字符串上出错:
dev_db=> select '1/2/2015'::date;
date
------------
2015-01-02
dev_db=> select 'asdf'::date;
ERROR: invalid input syntax for type date: "asdf"
LINE 1: select 'asdf'::date;
^
为了解决这个问题,你可以创建一个Postgresql函数来检查一个字符串是否是一个有效的日期,但实际上,只需处理迁移中每条记录的转换就会容易得多。