ここでは非常に複雑な問題があります。RubyがCSV行を保存してデータベースに割り当てるためにTempfileを作成します
を私はCSVライブラリを使用して2枚のスプレッドシートをエクスポートすることだし、1、2枚のシートの間に多くの関連にある問題は、私は特定の行の値に基づいて結果レコードの外部キーを保存する必要があるとそして、ここで次の行 からのデータの残りので、ここでは一例
1023115111 | SUMMARY | 1.5 | 2 | 2.5
8/16/2017 23:00 | 1.3 | 1.5 | 2 | 2.5
1023201 | SUMMARY | 1.9 | 2 | 2.1
8/16/2017 7:10 | 1.76 | 1.9 | 2 | 2.1
8/16/2017 15:00 | 1.76 | 1.9 | 2 | 2.1
を保存私は要約行が存在する最初のセルを取得し、それがメートルを見つける比較する必要が問題
ですそれは、この値に等しい「半ば」であるachineは
その後、行全体をスキップして、この値に等しいmachine_idは、私がしようとします
はそれをより明確にする新しいレコードに「結果」を保存
@mid = row(0)
@machine = Machine.where(mid: @mid)
その後、
Result.create(line: line, min: min, exps: real, max: max,
ideal: mean, time: time, machine_id: @machine.id )
これは私の結果モデル
ですこれは私のマシンモデル
require 'csv'
class Machine < ActiveRecord::Base
validates_uniqueness_of :name
has_many :results
def self.assign_row(row)
a, b, c = row
if row[2].nil?
puts 'na'
else
@mid = c[0..2]
@name = c[5..-1]
end
machine = Machine.find_by(name: c)
Machine.create(name: @name, mid: @mid) if machine.blank?
end
def self.import(file)
CSV.foreach(file.path, encoding: 'iso-8859-1:utf-8', skip_blanks: true) do |row|
machine = Machine.assign_row(row)
end
end
end
結果移行
class CreateResults < ActiveRecord::Migration
def change
create_table :results do |t|
t.string :min
t.string :max
t.string :time
t.string :exps
t.references :machine, index: true, foreign_key: true
t.string :line
t.string :ideal
t.timestamps null: false
end
end
end
マシンの移行
class CreateMachines < ActiveRecord::Migration
def change
create_table :machines do |t|
t.string :name
t.string :mid
t.timestamps null: false
end
add_index :machines, :mid
end
end
マシンコントローラインポート
def import
count = Machine.import(params[:file])
redirect_to machines_path, notice: "file imported successfully!"
end
です
結果コントローラのインポート
def import
count = Result.import params[:file]
redirect_to results_path, notice: "file imported successfully!"
end
は、私は私がデータベースに値を割り当て、その後一時ファイルにCSVを救うことができるかもしれないと思ったが、スキップ条件は、それを上書きしますか?
別の解決策が私の心に入ったのはhas_many_through
ですが、実際にはうまくいかないことはわかりません。