Rails投掷"无效日期"

时间:2018-01-27 17:50:44

标签: ruby-on-rails

我将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期待日期格式。任何最感谢的帮助

2 个答案:

答案 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中的一些箍来做到这一点。我必须先将列更改为数字,然后更改为日期。

相关问题