[英]importing records from .csv file creates completely blank rows in database
所有源代碼都托管在我的GitHub上的cloud_contacts存儲庫中。
我正在使Rails Cast#396與Rails 4一起使用。我已經使它工作了-sort--,它將導入一個充滿測試數據的文件。 然后,它將在數據庫中為.csv文件中的每個對應行(或聯系人)創建一條記錄。
我還可以在視圖中手動添加新聯系人,這是我自己構建的功能,與Rails Cast不相關。
我的問題是,為什么每個聯系記錄都為空白? 我認為問題出在我的聯系模型的導入方法上,也許是當每條記錄轉置時,標題中的列名與我數據庫中的列名不匹配。 如果是這種情況(我完全猜到了……),我該如何解決?
所有源代碼都托管在我的GitHub上的cloud_contacts存儲庫中。
但是如果您不喜歡聖誕節和GitHub,並且不想看回購,則這里是我的Contact.rb模型:
class Contact < ActiveRecord::Base
# attr_accessible :first_name, :last_name, :email_address
def self.import(file)
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
contact = find_by_id(row["id"]) || new
contact.attributes = row.to_hash.slice(*accessible_attributes)
# contact.attributes = row.to_hash.slice(*row.to_hash.keys)
contact.save!
end
end
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when ".csv" then Roo::CSV.new(file.path, csv_options: {col_sep: ";"})
when ".xls" then Roo::Excel.new(file.path)
when ".xlsx" then Roo::Excelx.new(file.path)
else raise "Unknown file type: #{file.original_filename}"
end
end
private
def self.accessible_attributes
[:first_name, :last_name, :email_address]
end
end
這是我的csv文件中數據的子集:
First Name Last Name Email Address Phone Number Company Name
Gerhard Kautzer gerhardkautzer@cronabayer.com 1-207-643-1816 Hodkiewicz-Lynch
Myra Crona myracrona@schinner.info (724)196-9470 x998 Champlin-Hahn
Josh Donnelly joshdonnelly@macejkovic.us 081-799-3139 x248 Casper Group
Verna Farrell vernafarrell@schillercorkery.name 731.101.6219 Rosenbaum-Hane
Lauriane Stracke laurianestracke@tremblayturner.biz 1-033-511-1831 x471 Prohaska-Sporer
Kaya Luettgen kayaluettgen@christiansen.name (511)745-9273 Wyman, Trantow and Hane
Steve Davis stevedavis@shields.info 787.315.2611 x747 Kuhic-Lowe
Citlalli Pfeffer citlallipfeffer@lemkeblanda.co.uk 329-584-6962 x047 Gorczany and Sons
Litzy Turcotte litzyturcotte@weber.name 1-084-641-4078 x4410 Hintz-Schmitt
River Lockman riverlockman@shieldsgrant.ca 1-967-129-8359 Rowe LLC
Juvenal Berge juvenalberge@nienow.co.uk 037-748-7238 Hane Inc
我對您的聯系人模型進行了一些更改,請在下面查看我的評論。
附言 您可能會發現使用better_errors gem有助於您隨時了解變量的外觀。
class Contact < ActiveRecord::Base
MAPPING = {
"First Name" => "first_name",
"Last Name" => "last_name",
"Email Address" => "email_address"
}
def self.import(file)
spreadsheet = open_spreadsheet(file)
header = spreadsheet.row(1)
(2..spreadsheet.last_row).each do |i|
row = Hash[[header, spreadsheet.row(i)].transpose]
# Convert the keys from the csv to match the database column names
row.keys.each { |k| row[ MAPPING[k] ] = row.delete(k) if MAPPING[k] }
# Remove company and phone number fields as these aren't in the database:
create(row.except!('Company Name', 'Phone Number'))
end
end
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
# You're using a tab seperated file, so specify seperator as a tab with \t
when ".csv" then Roo::CSV.new(file.path, csv_options: {col_sep: "\t"})
when ".xls" then Roo::Excel.new(file.path)
when ".xlsx" then Roo::Excelx.new(file.path)
else raise "Unknown file type: #{file.original_filename}"
end
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.