Better way to generate hashes instead of arrays
Kutomore opened this issue · 1 comments
Kutomore commented
Issue
I have a multisheet xlsx file in which the pagename is a class name, and every row name matches an attribute on my database.
I want to do something like
speadsheet = Roo::Spreadsheet.open(params[:file].path, extension: :xlsx)
speadsheet.each_with_pagename do |name, sheet|
sheet.each { |row| name.constantize.create(row) }
end
Which would require me to have the row as a hash instead of an array.
The documentation suggests:
sheet.each(id: 'ID', name: 'FULL_NAME') do |hash|
puts hash.inspect
# => { id: 1, name: 'John Smith' }
end
But having to specify the attributes for each model would make the code very repetitive and ugly, is there a way for me to let the gem know that, for example the id column will match the id attribute?
Hampei commented
sheet.each(headers: :first_row)
is what you want, but sadly yields the header row at the moment, so you'll have to skip that.
sheet.parse(headers: :first_row).each
works correctly, but will cost you a bit more memory.