我有这个场景,我需要一些设计建议,可能是一个小结构定义:
我有一个用户可以上传一个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插件和一些后台作业集成,以进行所有处理和类型检查背景
我需要一些数据库设计/结构帮助,因为我是新手。任何帮助都非常感谢,:)。
此致
答案 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
调用