Ruby on Rails持久存储来自CSV

时间:2015-07-30 11:58:16

标签: ruby-on-rails ruby ruby-on-rails-3 csv hash

我编写了一个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中,所以如果我想要做的事情没有意义,请提出问题。

3 个答案:

答案 0 :(得分:0)

您的.csv文件似乎已经在您的Rails应用目录中,因此加载时间不应该是坏的(除非它真的很大)。但是,如果该文件不会改变,并且您一次只需要一小部分文件,那么我会将其存储在您的数据库中。

创建与.csv文件中的数据相对应的模型/迁移,然后(迁移迁移后)运行脚本以将数据从.csv文件解析到数据库。

答案 1 :(得分:0)

我建议你应该采用第二种方法。以下是执行此操作的步骤: 设置新应用:

rails g model model_name column_name:text
rake db:migrate

创建模型:

serialize :column_name

打开model_name.rb文件并添加以下行

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

现在所有的一切。只需运行您的脚本来解析.csv文件并在db中存储哈希。您的列现在可以存储哈希。

#include

答案 2 :(得分:0)

我按照@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

我的模型在一个条目中包含整个哈希表!

我用这篇文章来弄清楚如何运行rake任务: http://erikonrails.snowedin.net/?p=212

具体来说,Lauralee(2012年12月20日上午8:47发布)页面的最后评论遇到了类似的问题。