1

我有这种情况,我需要一些设计建议,也许是一些结构定义:

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

好的,到目前为止一切都很好,现在问题是这个 csv 非常大,我的意思是它有大约 100 多个标题字段(听起来很疯狂),谁知道每个文件有多少记录,但无论如何,到目前为止,我们已经上传了这个 csv db 人口。但是等等,这个 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插件和一些后台作业集成,以在后台进行所有处理和类型检查。

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

问候

4

1 回答 1

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调用生成的类

另请参阅:从字符串创建类

于 2013-05-23T05:52:57.483 回答