Reputation: 694
I'm importing a csv file into pg database, and am getting this error that I never got before upgrading to 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
The exact error is with the birthday line. When I remove from .merge to ), things work. The csv headers look like this:
"Last Name","First Name","Membership Id","E-mail","Birthday"
and the rows look like this:
"Aber","Barbara","00591 2","[email protected]","07/05/2015"
I have also tried this line
:birthday => DateTime.strptime("%m/%d/%Y").strftime("%Y/%m/%d")
I believe the problem lies in the fact that many of the birthdays are populated with "", or are nil and I don't know how to tell the database to insert nil when it is expecting a date format. Any help most appreciated
Upvotes: 0
Views: 469
Reputation: 694
I had to go back to the csv original, open it in Office Calc and change the cells containing the date as a string. I first changed the column to a number, then a date with a format to match the sql format '2015-02-23' and it imported just fine. Thanks everybody! So it wasn't a Rails issue to begin with, but rather the misidentification of the column. I actually had to go through some hoops in Calc to do it. I had to change the column to a number first, then to a date.
Upvotes: 0
Reputation: 36880
You can rescue nil if the date conversion fails.
:birthday => (DateTime.strptime(row[4], "%m/%d/%Y").strftime("%Y/%m/%d") rescue nil)
In line rescue is generally not recommended as it can mask other raised exceptions (for example, if you accidentally typed DateTim
instead of DateTime
you wouldn't spot the problem) but used with care, in line rescue is a useful tool.
Upvotes: 2