6

我有 3 个模型,Church,有很多地点,有很多牧师。

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

我对此采取了稍微不同的方法,我发现两步过程更易于使用和构建。

第一步是加载数据。

我使用两个“分期”表。
就像是:

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 每秒只会插入几条记录,因此您希望能够重新启动、暂停等。

这也将有助于验证。最初,您只想加载数据,而不考虑任何约束(非空、唯一等)。

一旦加载到暂存中,您就可以更具选择性并根据需要应用验证。

于 2012-12-19T13:45:28.460 回答
0

我能够让它工作,以下是我使用的。让我知道是否有更聪明的方法可以做到这一点。注意:如果您尝试这样做,请将 csv 文件放在 rails 目录的根目录中,然后在控制台中逐行执行此脚本。至少我是这样让它工作的。

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 回答