Rails种子数据库从CSV - 日期格式的麻烦

时间:2011-11-18 01:51:48

标签: mysql ruby-on-rails csv rake

(这是我对ruby / rails和编程新手的必备路线;首先是SO问题)

我有一个rake任务从CSV中播放我的MySQL数据库 -

...
    CSV.read(uri).each do |row|
      Incident.create(
        :building_address => row[9],
        :agency => row[3],
        :complaint_type => row[6],
        :descriptor => row[5],
        :created => row[1],
        :closed => row[2],
        )
end

:created:closed被定义为日期字段(并且与rails created_at和updated_at字段分开/无关),但我假设CSV文件只识别字符串。

当我执行此任务时,日期和月份都会切换。因此,CSV中的1/12/2010 12:00:00 AM(美国的CSV和美国自己的意思是1月12日)最终会被解析为2010-12-1,而过去12的任何一天都会返回null,因此1/20/2010 12:00:00 AM会导致我的数据库中的空条目。

我添加了

date:
    formats:
        default: "%m/%d/%Y"

到我的en.yml,但这似乎只影响日期的显示,并且对通过我的rake任务创建对象没有影响。在搜索SO和其他资源后,我尝试了

:created => row[1].strftime,

:created => row[1].strptime,

但获得undefined method strptime/strftime for "Created Date":String(创建日期是CSV中列的名称)。

所以我也试过

:created => row[1].to_date

将CSV中的(可能)“日期”字符串更改为日期,但收到错误undefined method '<' for nil:NilClass

更改CSV中的日期字段似乎是一个非易失性,因为有100万条记录。

如何编辑此rake任务以从此CSV正确播种数据库?或者我应该更改:从日期创建到字符串并在应用程序逻辑中操作它?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用DateTime.strptime将字符串转换为DateTime实例:

:created => DateTime.strptime(row[1], '%m/%d/%Y %H:%M:%S %p'),
:closed  => DateTime.strptime(row[2], '%m/%d/%Y %H:%M:%S %p')

strptime类方法可以让您准确指定您正在使用的格式,这样就不会猜测任何软件。我建议你坚持使用ISO 8601日期和时间格式供将来内部使用,留下模糊的格式供人类消费。