【问题标题】:Rails CSV db populationRails CSV 数据库填充
【发布时间】:2013-01-17 18:34:47
【问题描述】:

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

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

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

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

这件事还没有解决。 Division 本身又进一步分为两种类型: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插件和一些后台作业集成来完成所有处理和类型检查背景。

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

问候

【问题讨论】:

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


    【解决方案1】:

    是的,您可以使用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2017-04-17
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多