(这是我对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正确播种数据库?或者我应该更改:从日期创建到字符串并在应用程序逻辑中操作它?
答案 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日期和时间格式供将来内部使用,留下模糊的格式供人类消费。