导入CSV文件的困惑

时间:2014-04-03 11:16:30

标签: csv ruby-on-rails-4 import

我跟着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 %>

1 个答案:

答案 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在数据库中找到产品。如果没有找到产品,将创建一个新产品。接下来,您将自定义散列中的所有属性切片,这些属性可在您的产品模型中访问。

如果一切顺利,您的产品将被保存,否则会引发异常。