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 上午)运行 遇到了类似的问题。