2011-11-04 36 views
0

我正在尝试运行一个ruby脚本,该脚本在每一行上分析带有相册名称,艺术家姓名,年份的文本文件。然后它应该将一条新记录保存到一个名为Album的Rails模型中。Ruby脚本将记录保存到Rails中

(buildDB.rb)

fh = File.open('albums.txt') 

while line = fh.gets 
    if (line =~ /^(.+)\~\s(.+) \(\'(\d\d)\)/) 
     a = Album.new 
     a.name = $1 
     a.artist = $2 
     a.year = $3 
     a.save 
    end 
end 

我正在红宝石buildDB.rb中产生的消息

buildDb.rb:12:in '<main>': uninitialized constant Album (NameError) 

这让我觉得剧本找不到机型终端。所以我尝试使用

require "C:/ruby192/www/Project02/config/environment.rb" 

加载ruby脚本的顶部。该脚本将运行没有错误,但没有提交到sqlite数据库。我也可以在已有的专辑上运行查找,但似乎我无法创建新的专辑。

我是一个rails noob所以,可能有更好的方法来做到这一点(seeds.rb或rake任务也许)。任何帮助或方向来看看将不胜感激。

回答

1

我会用耙子任务:

task :create_albums => :environment do 
    fh = File.open('albums.txt') 

    while line = fh.gets 
    if (line =~ /^(.+)\~\s(.+) \(\'(\d\d)\)/) 
     a = Album.new 
     a.name = $1 
     a.artist = $2 
     a.year = $3 
     a.save! 
    end 
    end 
    fh.close 
end 

我加了!到保存方法,以便任何错误都会引起怀疑。另外,请确保关闭文件。

+0

其实添加爆炸的问题的一部分提供给我。我将模型属性年设置为presence => true,但来自正则表达式的返回年份之一为空。这在脚本上抛出一个错误 –

+0

太棒了!得到它的工作,并了解了一些关于耙子任务。谢谢drummondj! –

0

Rake任务是未来的方向。我会使用FasterCSV,因为它会为您处理一些数据导入。

namespace :import do 
    desc "Import from a csv file" 
    task :album_csv, [:filename] => :environment do |task, args| 

    lines = FasterCSV.read(args[:filename]) rescue nil 
    if lines 
    lines.slice!(0) # remove the CSV header if there is one 
    puts "# Processing #{lines.count} records" 
    lines.each do |line| 
     a = Album.new 
     a.name = line[0] 
     a.artist = line[1] 
     a.year = line[2] 
     a.save! 
    end 
    end 
end 

然后,您可以打电话给你的耙子任务为:

rake import:album_csv[filename]