我将csv文件导入到pg数据库中,并且在升级到Rails 5之前我遇到了这个错误
def self.assign_from_row(row)
member = Member.where(membership_id: row[:membership_id]).first_or_initialize
member.assign_attributes row.to_hash.slice(
:last_name, :first_name, :membership_id, :email
).merge(
:birthday => row[4].nil? ? nil : DateTime.strptime(row[4], "%m/%d/%Y").strftime("%Y/%m/%d")
)
member
end
确切的错误是生日行。当我从.merge删除时,事情有效。 csv标题如下所示:
"Last Name","First Name","Membership Id","E-mail","Birthday"
并且行看起来像这样:
"Aber","Barbara","00591 2","bab@example.com","07/05/2015"
我也试过这行
:birthday => DateTime.strptime("%m/%d/%Y").strftime("%Y/%m/%d")
我认为问题在于许多生日都填充了""或者是nil而且我不知道如何告诉数据库插入nil期待日期格式。任何最感谢的帮助
答案 0 :(得分:2)
如果日期转换失败,您可以营救nil。
:birthday => (DateTime.strptime(row[4], "%m/%d/%Y").strftime("%Y/%m/%d") rescue nil)
通常不推荐在线救援,因为它可以掩盖其他引发的异常(例如,如果您不小心输入了DateTim
而不是DateTime
,则您不会发现问题)但是请小心使用,在线救援是一个有用的工具。
答案 1 :(得分:0)
我不得不回到csv原版,在Office Calc中打开它并将包含日期的单元格更改为字符串。我首先将列更改为数字,然后使用格式匹配sql格式的日期' 2015-02-23'它进口得很好。谢谢大家! 因此,开始时不是Rails问题,而是对列的错误识别。我实际上不得不经历Calc中的一些箍来做到这一点。我必须先将列更改为数字,然后更改为日期。