1

私はいくつかの設計提案、おそらく少しの構造定義が必要なこのシナリオを持っています:

csv ファイルをアップロードできるユーザーがいて、そのファイルの内容に基づいて、データベースにデータを入力する必要があります。

これまでのところ、この csv は非常に大きいということです。つまり、100 個以上のヘッダー フィールドがあり (クレイジーに聞こえます)、1 ファイルあたりのレコード数は誰にもわかりませんが、とにかく、これまでのところ、この csv のアップロードとデシベルの人口。ただし、この csv ファイルは、フィールド (「DIVISION」) に基づいて分類/分類する必要があります。Division は整数列であり、その値に基づいて、この csv が属する Division を特定する必要があります。これまでのところ、次の要件があります。

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

問題はまだ解決されていません。部門自体は、さらに REGULAR と PROMO の 2 つのタイプに分類されます。

各タイプのヘッダーを持つサンプルがあります。したがって、この 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を使用し、csv処理にはsmarter_csv gemを使用してから、フロントエンドのファイル処理とアップロードの進行状況にはjquery.fileuploadプラグインのようなjqueryプラグインを使用し、バックグラウンドですべての処理とタイプチェックを行うにはバックグラウンドジョブ統合を使用します。

私は初心者なので、データベースの設計/構造のヘルプが必要です。どんな助けでも大歓迎です:)。

よろしく

4

1 に答える 1

0

はい、smarter_csv を使用して CSV ファイルをインポートできます。

行ごとに、100 以上のキーと値のペアを含む 1 つのハッシュを取得します。キーは CSV ファイルのヘッダーです (可能な変更後)。

簡単にするために、CSV ファイルの列の 1 つによって、データベースに作成するレコードの種類が決まるとします。たとえば、「部門」または「タイプ」などです。

Ads のデータを 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 に答える