与rails中的import excel文件相关的问题

时间:2016-07-12 11:15:55

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

我正在关注Ryan Bates railscast网站,作为将excel文件导入我的rails应用程序的教程。最后我做到了。现在我想用这个excel数据执行更复杂的操作。我能够将excel文件的全部内容导入到数据库表中。但是现在我想在插入数据库之前获取excel文件的每一行。我需要对excel文件的每一行执行操作。我不知道如何实现这一点。

我的型号名称是员工,因此我的表名是员工。 现在我的模型是: -

class Employee < ActiveRecord::Base

def self.import(file)
    spreadsheet= Employee.open_spreadsheet(file)
    header=spreadsheet.row(1)
    (2..spreadsheet.last_row).each do |i|
        row=Hash[[header,spreadsheet.row(i)].transpose]
        em=find_by_id(row["id"])||new
        em.attributes=row.to_hash.slice('firstname')
        em.save
    end
end

def self.open_spreadsheet(file)
    case File.extname(file.original_filename)
    #when ".csv" then Roo::Csv.new (file.path nil, :ignore)
    when ".xlsx" then Roo::Excelx.new (file.path)
    #when ".xlsx" then Excelx.new (file.path, nil, :ignore)
    else raise "Unknown file type: #{file.original_filename}"
    end
end

end

另一个问题是我想将行的内容传递给控制器​​,但我知道在MVC架构中我不应该将模型数据传递给控制器​​。然后告诉我有什么出路吗?

1 个答案:

答案 0 :(得分:0)

不要崇拜MVC,更重要的是导入数据不是与模型相关的事情。如果您关心干净的MVC - 将您的代码移动到rake任务。

这是后台任务吗?如果是这样,你甚至不需要控制器。 否则,如果您对获取的字符串有一些用户操作,请将您的代码放入控制器(例如,用户上传excel文件,输入转换数据等)。

您(或用户)可以修改迭代器中的数据。 row是一个哈希,标题为键,值为ceil内容。例如,如果你想删除特殊字符:

def self.import(file)
  spreadsheet = Employee.open_spreadsheet(file)
  header = spreadsheet.row(1)
  (2..spreadsheet.last_row).each do |data|
    spreadsheet.row(data).map! do |ceil| 
      ceil.class == String ? ceil.gsub!(/[!@%&"]/,'') : ceil }
    end

    row = Hash[[header,spreadsheet.row(data)].transpose]

    em = find_by_id(row["id"]) || new
    em.attributes = row.to_hash.slice('firstname')
    em.save
  end
end