gpt4 book ai didi

ruby-on-rails - 一次将 CSV 文件导入多个模型

转载 作者:行者123 更新时间:2023-12-03 22:40:06 27 4
gpt4 key购买 nike

我有 3 个模型,Church,有很多 Locations,有很多 Pastors。

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 应用程序移动到另一个应用程序。

最佳答案

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

第一步是加载数据。

我使用两个“暂存”表。
就像是:

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

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

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

关于ruby-on-rails - 一次将 CSV 文件导入多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13944931/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com