首页 文章

Rails CSV db population

提问于
浏览
1

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

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

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

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

此事仍未得到解决 . 分部本身进一步分为两种类型:REGULAR和PROMO

我有样品,其中我有每种类型的 Headers . 因此,我们还需要确定此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

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

    对于每个行,您将获得一个具有100个键/值对的散列,其中键是CSV文件中的 Headers (在可能的修改之后) .

    为简单起见,假设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

相关问题