6

私は 3 つのモデルを持っています。教会には多くの場所があり、多くの牧師がいます。

require 'csv'  
csvfile = File.read("testimport.csv")
csv = CSV.parse(csvfile, :headers => false)
csv.each do |row|
  c = Church.new
     c.name = row[0]
     c.url = row[10]
   c.locations.build(:address => row[3], :zipcode => row[5], :phone => row[6], :email => row[2], :city => row[4])
   c.save
end

短いコード ブロックでわかるように、教会とその最初の場所を作成しています。それに牧師を追加するにはどうすればよいでしょうか。

たとえば、これは機能しますか?

require 'csv'  
csvfile = File.read("testimport.csv")
csv = CSV.parse(csvfile, :headers => false)
csv.each do |row|
  c = Church.new
     c.name = row[0]
     c.url = row[10]
     location = c.locations.build(:address => row[3], :zipcode => row[5], :phone => row[6], :email => row[2], :city => row[4])
     location.pastors.build(:name => row[10])
     location.save
   c.save
end

これについて私が行くべき別の方法はありますか?ある Rails アプリから別のアプリに何千ものレコードを移動しようとしています。

4

2 に答える 2

1

私はこれに対して少し異なるアプローチをとっています.2段階のプロセスが使いやすく、構築しやすいことがわかりました.

最初のステップは、データのロードです。

2 つの「ステージング」テーブルを使用します。
何かのようなもの:

staging_header
id           Integer  Unique  Primary Key
run_number   Integer  Unique
run_name     String

staging_data:
id                 Integer  Unique  Primary Key
staging_header_id  Integer
element1           String
element2           String
element3           String
uploaded?          Boolean  # Placed on the individual records allows restarts. 
...

したがって、これらのロード テーブルに testimport.csv を直接ロードします。run_number を一意にすると (シーケンスなど)、複数の実行がサポートされます。

これで、SQL にデータがあり、Rails で利用できるようになりました。

次に、このロード領域からアプリケーション テーブルに実際にデータを入力するコードを記述します。

これは、速度の問題にも役立ちます。Rails は 1 秒あたり数レコードしか挿入しないため、再起動、一時停止などを実行できるようにする必要があります。

これは検証にも役立ちます。最初は、制約 (非 null、一意など) に関係なく、データをロードするだけです。

ステージングに読み込まれると、より選択的になり、必要に応じて検証を適用できます。

于 2012-12-19T13:45:28.460 に答える
0

私はこれを機能させることができました、以下は私が使用したものです。これを行うためのより賢い方法があるかどうか教えてください。注:これを実行しようとしている場合は、csvファイルをrailsディレクトリのルートに配置し、コンソールでこのスクリプトを1行ずつ実行します。少なくともそれが私がそれを機能させた方法です。

require 'csv'  
csvfile = File.read("testimport.csv")
csv = CSV.parse(csvfile, :headers => false)
csv.each do |row|
   c = Church.new
     c.name = row[0]
     c.url = row[10]
   c.locations.build(:title => "Sanctuary", :address => row[3], :zipcode => row[5],     :phone => row[6], :email => row[2], :city => row[4])
   c.save
loc = c.locations.first
loc.pastors.build(:firstname => row[1])
loc.save

end
于 2012-12-19T13:41:14.813 に答える