Ruby on rails 如何在rails 3.2中编写rake任务以使用excel创建数据

Ruby on rails 如何在rails 3.2中编写rake任务以使用excel创建数据,ruby-on-rails,ruby-on-rails-3.2,rake-task,Ruby On Rails,Ruby On Rails 3.2,Rake Task,我想通过导入excel创建数据 我在excel文件中得到了状态记录,我的状态模型只有一个字段state\u名称 我想做一个rake任务来创建excel文件中所有状态的所有记录,但我不知道如何使用excel 我在lib/tasks中创建了一个基本的rake任务: namespace :state do task :create => :environment do end end 我如何放置读取excel文件并基于该文件创建状态的代码?如果你自己做,你必须自己管理翻译,自己编写所有

我想通过导入excel创建数据

我在excel文件中得到了状态记录,我的状态模型只有一个字段state\u名称

我想做一个rake任务来创建excel文件中所有状态的所有记录,但我不知道如何使用excel

我在lib/tasks中创建了一个基本的rake任务:

namespace :state do
  task :create => :environment do
  end
end

我如何放置读取excel文件并基于该文件创建状态的代码?

如果你自己做,你必须自己管理翻译,自己编写所有帮助程序,自己管理所有数据。有了一个库,您可以节省大量的工作,如果需要添加或删除区域,您可以快速轻松地完成。我不建议你自己做

如果您打算自己做,那么最好的办法是以可预测的方式以CSV格式保存数据,并通读CSV创建条目。假设您的CSV采用以下格式:

State,Country
Alabama,USA
Arkansas,USA
...
解析它很简单:

require "csv"

task :load_states => :environment do
  CSV.foreach(csv_file, {headers: :first_row}) do |row|
    state = State.create(name: row["State"])
    state.country = Country.where(name: row["Country"]).first_or_create
    state.save
  end
end

如果你自己做,你必须自己管理翻译,自己编写所有的助手,自己管理所有的数据。有了一个库,您可以节省大量的工作,如果需要添加或删除区域,您可以快速轻松地完成。我不建议你自己做

如果您打算自己做,那么最好的办法是以可预测的方式以CSV格式保存数据,并通读CSV创建条目。假设您的CSV采用以下格式:

State,Country
Alabama,USA
Arkansas,USA
...
解析它很简单:

require "csv"

task :load_states => :environment do
  CSV.foreach(csv_file, {headers: :first_row}) do |row|
    state = State.create(name: row["State"])
    state.country = Country.where(name: row["Country"]).first_or_create
    state.save
  end
end

您可以将xls文件放入/tmp目录。然后将gem放入您的gem文件中。然后使用read方法将xls.rb类创建到lib中

class Xls
  require 'spreadsheet'

  def self.read file_path
    Spreadsheet.open(file_path) do |book|
      book.worksheets.each do |ws|
        0.upto ws.last_row_index do |index|
          row = ws.row(index)
          yield ws, row
        end
      end
    end
  end

end
然后,进入你的任务

namespace :project do
  desc "Load xls"
  task :load => :environment do
    Xls.read("xls_file_path") do |sheet, row|
      state = row[0] #row[0] = the first column of the this row. 
      YourModel.save(state: state)
    end
  end
end

您可以将xls文件放入/tmp目录。然后将gem放入您的gem文件中。然后使用read方法将xls.rb类创建到lib中

class Xls
  require 'spreadsheet'

  def self.read file_path
    Spreadsheet.open(file_path) do |book|
      book.worksheets.each do |ws|
        0.upto ws.last_row_index do |index|
          row = ws.row(index)
          yield ws, row
        end
      end
    end
  end

end
然后,进入你的任务

namespace :project do
  desc "Load xls"
  task :load => :environment do
    Xls.read("xls_file_path") do |sheet, row|
      state = row[0] #row[0] = the first column of the this row. 
      YourModel.save(state: state)
    end
  end
end

你所说的“国家”是什么意思,比如一个国家的一个地区?如果是这样的话,你可能想使用这样的工具来处理你和翻译。是的,国家就像一个国家的一个地区,我不想使用carmen rails,而是想用excel和Rakey来做。你说的“国家”是什么意思,像一个国家的一个地区?如果是这样的话,你可能想使用这样的工具来处理你和翻译。是的,像一个国家的一个地区一样,我不想使用carmen rails,我想用excel和Rakeo来完成它,如果你没有标题并且通过索引访问行元素(
行[0]
),那么就可以明显地省略
{headers::first_row}
)您可以使用first_或_create来删除条件,即
country=country.where(name:row[“country”])。first_或_create
(rails 4)-请看您是否正确,当我写建议时,您对这一点感到困惑。谢谢并更新了答案。如果您没有标题,并且通过索引(
row[0]
)而不是标题名访问行元素,那么显然可以省略
{headers::first\u row}
。您可以使用first\u或\u create删除条件,即
country=country.where(name:row[“country”])。first\u或\u create
(rails 4)-看你是对的,当我写建议的时候,你对这一点感到茫然。谢谢并更新了答案。请先尝试使用“Microsoft Excel 97/2000/XP/2003(.xls)”格式保存电子表格。我只是演示如何读取xls文件并执行rake任务。如果你需要的话,你可以用另一个工具来做这个。或者,例如…感谢它能工作+1的精彩解释,如果你能写一篇关于如何使它也能与roo一起工作的帖子,那就太好了:)试着先用“Microsoft Excel 97/2000/XP/2003(.xls)”格式保存你的电子表格。我只是演示如何读取xls文件并执行rake任务。如果你需要的话,你可以用另一个工具来做这个。或者,比如说……谢谢你对它的解释,如果你能写一篇关于如何让它与roo一起工作的帖子,那就太好了:)