我跟着this instruction将CSV文件导入我的项目。 但是,我发现一些令我困惑的事情。我下载了演示项目here
在这个项目中,我并不知道它是如何将数据添加到表中的(因为我没有看到任何关于代码的解释)。代码在这里:
<%= form_for @product_import do |f| %>
<% if @product_import.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@product_import.errors.count, "error") %> prohibited this import from completing:</h2>
<ul>
<% @product_import.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.file_field :file %>
</div>
<div class="buttons"><%= f.submit "Import" %></div>
<% end %>
答案 0 :(得分:0)
好吧,你应该仔细看看导入方法:
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]
product = find_by_id(row["id"]) || new
product.attributes = row.to_hash.slice(*accessible_attributes)
product.save!
end
end
第一行正是它所说的,它打开你刚刚上传的文件。电子表格中的第一行应始终包含标题。因此,第2行将第一行保存为标题。
接下来,您将循环所有其他行,直到最后一行填充。这是CSV或Excel文件中的所有数据。行变量中发生的是您创建一个自定义哈希,其中您将每行的值与第一行的标题耦合。
现在回答真正的问题。创建自定义哈希后,您可以通过行哈希的ID在数据库中找到产品。如果没有找到产品,将创建一个新产品。接下来,您将自定义散列中的所有属性切片,这些属性可在您的产品模型中访问。
如果一切顺利,您的产品将被保存,否则会引发异常。