Rails CSV db population

时间:2013-02-02 15:28:23

标签: ruby-on-rails validation csv carrierwave uploading

我有这个场景,我需要一些设计建议,可能是一个小结构定义:

我有一个用户可以上传一个csv文件,根据该文件的内容我必须填充数据库,听起来很简单呃!

好了到目前为止这么好,现在问题是这个csv非常大,我的意思是它有100多个标题字段(听起来很疯狂)并且知道每个文件有多少条记录,但无论如何,到目前为止我们都有这个csv上传和数据库填充。但是等等,这个csv文件需要根据字段(“DIVISION”)进行分类/分类。除法是一个整数列,根据它的值我需要确定这个csv属于哪个除法。到目前为止,我们有以下要求:

    => CSV file uploading
    => File classification based on div id
    => record insertion

此事尚未解决。分部本身进一步分为两种类型:REGULAR和PROMO

我有样本,其中我有每种类型的标题。因此,我们还需要确定此csv所属的分区类型,然后开始处理。

    => CSV file uploading
    => File classification based on div id and headers (counting and matching the headers for div-sub type using some already defined hash of headers for each division)

因此,在识别文件,即文件属于哪个分区和子类型之后,我需要对字段进行一些验证,例如,存在,然后进行一些格式检查等。

我想使用carrierwave进行文件上传,使用smarter_csv gem进行csv处理,然后使用一些jquery插件进行前端文件处理和上传进度,如jquery.fileupload插件和一些后台作业集成,以进行所有处理和类型检查背景

我需要一些数据库设计/结构帮助,因为我是新手。任何帮助都非常感谢,:)。

此致

1 个答案:

答案 0 :(得分:0)

是的,您可以使用smarter_csv导入CSV文件。

对于每一行,您将获得一个具有100多个键/值对的哈希,其中键是CSV文件中的标题(在可能的修改之后)。

为简单起见,假设您的CSV文件中的一列确定您要在数据库中创建哪种记录,例如: “分裂”或“类型”

假设您尝试从CSV文件将广告数据上传到数据库,则需要相应地创建模型。如果您的100多列永远不会更改名称,那么最好使用单表继承(STI)对其进行建模:

 class Ad < ActiveRecord::Base
 ...
 end

 class  AdRegular < Ad
 end

 class AdPromo < Ad
 end

在上传控制器中,您需要执行以下操作:

 require 'smarter_csv'{:chunk_size => 1} ) do |array|
   row_hash = array.first 
   case row_hash[:type]
   when 'regular'
      AdRegular.create( row_hash )
   when 'promotion'
      AdPromo.create( row_hash )
   else
      puts "ERROR, unexpected :type in CSV file: #{row_hash[:type]}"
   end
 end

您还可以从字符串row_hash[:type]创建类名,然后对生成的类进行create调用

另请参阅:Create Class from String