【发布时间】:2011-11-18 01:51:48
【问题描述】:
(这是我关于 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 正确地为我的数据库播种?还是应该将 :created 从日期更改为字符串并在应用程序逻辑中对其进行操作?
【问题讨论】:
标签: mysql ruby-on-rails csv rake