2011-04-09 14 views
8

私にこのことを教えてください。Ruby on Rails 3でテーブルとモデルを素早く作成する(動的に)

私が働いているアプリでは、ユーザーは好みのヘッダーとデータの任意の列を使って、システムにCSVファイルをアップロードできます。 CSVを使用してデータベースにテーブルを作成し、データを書き込むと、さまざまな用途、検索、並べ替えなどのためにシステムからアクセスできます。

古い(テーブルが存在していれば、モデルファイルにクラスが定義されていなくてもオブジェクトが作成された場合)

新しいバージョンがRoR3で書かれていますが、私はまだこれを行う方法を理解していません。私は、モデル内のマイグレーションツールを呼び出すことでテーブルの作成を整理しました(Rails-yではなく、必要があります...)。しかし、作成した新しいテーブルにリンクする方法は見つけられません関係を構築したり、何か他のものを構築したりすることができます。

私は何のために望んでいることのいずれかである、

a)は、ここにいる誰かが、その場でのテーブルとモデルを作成するよりも、これを行うためのより良い方法があります(ここでは警告、これらのファイルは、の100,000年代を含めることができますレコードとフィールドが異なるため、1つのテーブルオプションがうまく機能しません)。つまり、この問題のデータベース設計が優れています。

または

b)モデルの問題を解決する方法を教えてください。

私はRoRのための博士NICのマジックモデルの宝石を見てきましたが、私がテキストの壁のための

申し訳ありませんが何か間違ったことをやっている場合を除き、RoR3で働く任意の提案を楽しみにしていないよう

ありがとうございます事前にありがとう

+0

だけで野生の検証します思考:たぶん、その場でマイグレーションファイルを作成してから、そのファイルとdb:migrateをリロードしてみてください。 – Zabba

+0

@Zabba、それは何を達成するでしょうか? RoRの経験が不足していると言えますが、モデルではなくテーブルを作成するだけの移行ではありませんか?それとも、テーブルを作成するのが「より良い」方法であるということを意味しましたか? – fullybaked

+0

はい、私はテーブルの作成についての部分を意味しました。しかし、モデルファイルを作成してロードすることもできます。私は*と仮定します。このようなことはまだ経験していません。 – Zabba

答えて

9

OK、私は思っていますが、良いことは別のものです。

基本的には、Rail ActiveRecordを介してSQLを実行して、オンザフライでテーブルを作成します。 次はモデルを使用し、その名前を変更します(Model.table_name)。このような

何か:あなたの問題の一つは、モデルのロジックが&団体で、

MyModel.table_name = "my_table" 
records = MyModel.all 

OK:

// SQL Create table 
    sql = "CREATE TABLE my_table (id int(11) NOT NULL AUTO_INCREMENT, code varchar(3) NOT NULL)" 
    ActiveRecord::Base.connection.execute(sql) 

次にモデルとあなたのような、その場でテーブル名を変更することができます。あなたは種類が限られていますが、おそらく回避策があります。

これは本当にベストプラクティスですが、これが必要な場合は、私はそれが動作するかもしれないと思う!

5

私はcsvファイルをアップロードし、そのファイルをアクティブなレコードモデルに変換するために使用されるappを実装しました。このリポジトリをチェックアウトすることができます。ここ

ログインhttps://github.com/Athul92/Salary_Sheet_Comparison/blob/master/app/models/makemodel.rb

は、それが達成された方法についての小さなアイデアです:いくつかの不具合はこれでもあります

class Makemodel < ActiveRecord::Migration 
    def self.import(file,project_name,file_name,start_row,end_row,unique,last_column) 
     spreadsheet = open_spreadsheet(file) 
     header = spreadsheet.row(start_row.to_i) 
     i=0 
     header.count.times do 
     unless header[i].nil? 
      header[i]= header[i].gsub(/[^0-9A-Za-z]/, '').downcase 
     end 
     i+=1 
     end 
     name = "#{project_name.downcase}"+"#{file_name.downcase}" 
     create_table name.pluralize do |t| 
     header.each do |head| 
      t.string head 
     end 
     end 
     model_file = File.join("app", "models", name.singularize+".rb") 
     model_name = name.singularize.capitalize 
     File.open(model_file, "w+") do |f| 
     f << "class #{model_name} < ActiveRecord::Base\nend" 
     end 

     ((start_row.to_i+1)..end_row.to_i).each do |i| 
     row = Hash[[header, spreadsheet.row(i)].transpose] 
     #should find a logic to find the model class that is being created 
     product = Object.const_get(name.capitalize).new 
     product.attributes = row.to_hash 
     product.save! 
     end 
    end 

    def self.open_spreadsheet(file) 
     case File.extname(file.original_filename) 
     when ".csv" then Csv.new(file.path, nil, :ignore) 
     when ".xls" then Roo::Excel.new(file.path) 
     when ".xlsx" then Roo::Excelx.new(file.path) 
     else raise "Unknown file type: #{file.original_filename}" 
     end 
    end 
    end 

関連を追加することは困難であり、また

関連する問題