Ruby on rails “扔铁轨”;无效日期“;

Ruby on rails “扔铁轨”;无效日期“;,ruby-on-rails,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, :ema

我正在将一个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
确切的错误是生日线。当我从中删除。合并到)时,一切正常。csv标题如下所示:

"Last Name","First Name","Membership Id","E-mail","Birthday"
"Aber","Barbara","00591 2","bab@example.com","07/05/2015"
这些行如下所示:

"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

:birthday => (DateTime.strptime(row[4], "%m/%d/%Y").strftime("%Y/%m/%d") rescue nil)

通常不建议使用联机救援,因为它可以掩盖其他引发的异常(例如,如果您意外地键入了
DateTim
而不是
DateTime
,则不会发现问题),但如果小心使用,联机救援是一个有用的工具。

如果日期转换失败,您可以援救nil

:birthday => (DateTime.strptime(row[4], "%m/%d/%Y").strftime("%Y/%m/%d") rescue nil)

通常不建议使用在线救援,因为它可以掩盖其他引发的异常(例如,如果您意外键入了
DateTim
而不是
DateTime
,您将无法发现问题),但使用时要小心,在线救援是一个有用的工具。

我不得不回到原始csv,在Office Calc中打开它,并将包含日期的单元格更改为字符串。我首先将列更改为一个数字,然后是一个日期,其格式与sql格式“2015-02-23”相匹配,并且导入得很好。谢谢大家!
因此,这不是Rails的问题,而是对专栏的错误识别。事实上,我必须在加州大学里经历一些考验才能做到这一点。我必须先将列更改为数字,然后更改为日期。

我必须返回到原始csv,在Office Calc中打开它,并将包含日期的单元格更改为字符串。我首先将列更改为一个数字,然后是一个日期,其格式与sql格式“2015-02-23”相匹配,并且导入得很好。谢谢大家!
因此,这不是Rails的问题,而是对专栏的错误识别。事实上,我必须在加州大学里经历一些考验才能做到这一点。我必须先将列更改为数字,然后更改为日期。

请包含准确的错误。此外,将CSV向下修剪为导致错误的一行,并包括该CSV行。如果你能把它归结为一个令人不快的专栏,那就更好了。另外,Rails 5提交可能与此有关:请包含确切的错误。此外,将CSV向下修剪为导致错误的一行,并包括该CSV行。如果你能把它归结为一个令人不快的专栏,那就更好了。此外,Rails 5提交可能与此有关: