Ruby Rails 从 CSV 持久存储哈希
Ruby on Rails persistently store Hash from CSV
我编写了一个 ruby 脚本,它接受一个 CSV 文件并将输入转换为散列:
Culper = File.open('.\CulperCSV.csv')
culper_hash = {}
# set up culper code hash from provided CSV
CSV.foreach(Culper) do |row|
number, word = row
culper_hash[word] = number
end
我正在尝试使用该脚本制作一个 Rails 应用程序。
我的问题:如何持久存储散列(或 CSV 数据以便构建散列),以便最大限度地减少加载时间?
我的想法:
1) 将 CSV 数据加载到数据库中(将其播种),每次我的网站上有访问者时,将上述分配执行到散列中,但从数据库中进行。 (不知道该怎么做,但我可以研究一下)。
或
2) 将完整的散列加载到数据库中(我想我必须将它序列化?)这样我就可以从数据库中提取一次并准备好散列。
我对构建应用程序非常陌生,尤其是在 Rails 方面,所以如果我尝试做的事情没有意义,请提出问题。
您的 .csv
文件似乎已经在您的 Rails 应用程序目录中,因此加载时间应该不错(除非它真的很大)。但是,如果该文件不会更改并且您一次只需要其中的一小部分,那么我会将其存储在您的数据库中。
创建一个 model/migration 对应于您在 .csv
文件中的数据,然后(在迁移迁移之后)运行 一个脚本来解析您的 .csv
文件到你的数据库。
我建议你应该采用第二种方法。以下是执行此操作的步骤:
设置新应用:
rails new app_name
bundle install
rake db:create
创建模型:
rails g model model_name column_name:text
rake db:migrate
打开 model_name.rb 文件并添加以下行
serialize :column_name
现在所有设置。只需 运行 您的脚本即可解析 .csv 文件并将散列存储在数据库中。您的列现在可以存储散列。
Culper = File.open('.\CulperCSV.csv')
# get the object from database
obj = ModelName.first
# set up culper code hash from provided CSV
CSV.each(Culper) do |row|
number, word = row
obj.column_name[word] = number
end
obj.save
我按照@Kh Ammad 的建议设法解决了我的问题:设置一个新的应用程序,为其创建一个模型,并将我的列标记为可序列化。
但是,我在 运行 使用散列填充模型的脚本时遇到了一些问题,因此,经过一些研究,我创建了下面的 rake 任务:
#lib/tasks/import.rake
require 'csv'
task :import, [:filename] => :environment do
culper_hash = {}
Culper = File.open('.\CulperCSV.csv')
CSV.foreach(Culper) do |row|
number, word = row
culper_hash[word] = number
end
# culper_hash == column_name
obj = CulperDict.create(culper_hash: culper_hash)
obj.save
end
和运行它与:
$ bundle exec rake import
我的模型在一个条目中包含了整个哈希 table!
我通过这篇文章了解了如何 运行 抽成任务:
http://erikonrails.snowedin.net/?p=212
具体来说,Lauralee 在页面上的最后评论(发布于 2012 年 12 月 20 日 8:47 上午)运行 遇到了类似的问题。
我编写了一个 ruby 脚本,它接受一个 CSV 文件并将输入转换为散列:
Culper = File.open('.\CulperCSV.csv')
culper_hash = {}
# set up culper code hash from provided CSV
CSV.foreach(Culper) do |row|
number, word = row
culper_hash[word] = number
end
我正在尝试使用该脚本制作一个 Rails 应用程序。
我的问题:如何持久存储散列(或 CSV 数据以便构建散列),以便最大限度地减少加载时间?
我的想法:
1) 将 CSV 数据加载到数据库中(将其播种),每次我的网站上有访问者时,将上述分配执行到散列中,但从数据库中进行。 (不知道该怎么做,但我可以研究一下)。
或
2) 将完整的散列加载到数据库中(我想我必须将它序列化?)这样我就可以从数据库中提取一次并准备好散列。
我对构建应用程序非常陌生,尤其是在 Rails 方面,所以如果我尝试做的事情没有意义,请提出问题。
您的 .csv
文件似乎已经在您的 Rails 应用程序目录中,因此加载时间应该不错(除非它真的很大)。但是,如果该文件不会更改并且您一次只需要其中的一小部分,那么我会将其存储在您的数据库中。
创建一个 model/migration 对应于您在 .csv
文件中的数据,然后(在迁移迁移之后)运行 一个脚本来解析您的 .csv
文件到你的数据库。
我建议你应该采用第二种方法。以下是执行此操作的步骤: 设置新应用:
rails new app_name
bundle install
rake db:create
创建模型:
rails g model model_name column_name:text
rake db:migrate
打开 model_name.rb 文件并添加以下行
serialize :column_name
现在所有设置。只需 运行 您的脚本即可解析 .csv 文件并将散列存储在数据库中。您的列现在可以存储散列。
Culper = File.open('.\CulperCSV.csv')
# get the object from database
obj = ModelName.first
# set up culper code hash from provided CSV
CSV.each(Culper) do |row|
number, word = row
obj.column_name[word] = number
end
obj.save
我按照@Kh Ammad 的建议设法解决了我的问题:设置一个新的应用程序,为其创建一个模型,并将我的列标记为可序列化。
但是,我在 运行 使用散列填充模型的脚本时遇到了一些问题,因此,经过一些研究,我创建了下面的 rake 任务:
#lib/tasks/import.rake
require 'csv'
task :import, [:filename] => :environment do
culper_hash = {}
Culper = File.open('.\CulperCSV.csv')
CSV.foreach(Culper) do |row|
number, word = row
culper_hash[word] = number
end
# culper_hash == column_name
obj = CulperDict.create(culper_hash: culper_hash)
obj.save
end
和运行它与:
$ bundle exec rake import
我的模型在一个条目中包含了整个哈希 table!
我通过这篇文章了解了如何 运行 抽成任务: http://erikonrails.snowedin.net/?p=212
具体来说,Lauralee 在页面上的最后评论(发布于 2012 年 12 月 20 日 8:47 上午)运行 遇到了类似的问题。