2013-02-28 45 views
0

我想添加一行CSV到表中的记录,除了事实上没有任何实际显示的事实,一切似乎都正常工作。Rake任务不将CSV添加到数据库

这里是我的Rake任务:

namespace :csv do 

    desc "Import CSV Data" 
    task :c_up => :environment do 

    require 'csv' 

    csv_file_path = 'db/main.csv' 

    CSV.foreach(csv_file_path, :headers => true) do |row| 
     row = Entry.create!({ 
     :one => row[0], 
     :two => row[1], 
     :three => row[2], 
     :four => row[3], 
     :five =>row[4], 
     :six => row[5], 
     :seven => row[6], 
     :eight => row[7], 
     :nine => row[8], 
     :ten => row[9] 
     }) 
     row.save 
     puts "Entry added!" 

    end 
    end 
end 

在我的CSV标头的命名相匹配的属性。

当我运行任务时,我收到没有错误和所有的“条目添加!”出现在控制台中。我已经尝试过,没有row =row.save,因为我看过很多没有这些例子的例子,但它没有帮助。

耙子结束后根本没有任何记录。有什么明显的我做错了吗?看来这是我见过的大多数例子。

编辑感谢您的所有答案和评论!很明显,这一直是语法上的缺陷,我会尝试一下你的建议,然后我会更新它。再次感谢!

编辑2原来是你们所有人都指出的语法问题,所以对所有人表示感谢!当我评论它仍然不起作用的原因是一个无关的问题,如果没有@ jvnill的评论,我不会想到这个问题。

+0

很奇怪,没有r ecord被创建,当你调用'#create!'时你不会得到任何异常。你确定你的csv有一些内容吗? – jvnill 2013-02-28 14:15:51

+1

与答案相反,即使调用save和{},只要它通过验证,它仍应该保存。更有用的方法是使用'Entry.new',然后'puts'添加条目!“如果row.save'只是为了确保它确实试图保存记录,而不是仅仅通过循环 – jvnill 2013-02-28 14:17:28

+0

这就是我的想法,并且我尝试了新的并且为行添加了条件。 save'和'“Entry added!”',看起来好像所有东西都保存得很好,当我打开Sublime Text时,可以在添加新记录时快速查看development.sqlite3-journal。我想这可能是其他地方的问题,但我不知道什么可能会搞砸了。 – Jason 2013-02-28 14:28:37

回答

1

尝试:

row = Entry.new(
     :one => row[0], 
     :two => row[1], 
     :three => row[2], 
     :four => row[3], 
     :five =>row[4], 
     :six => row[5], 
     :seven => row[6], 
     :eight => row[7], 
     :nine => row[8], 
     :ten => row[9] 
    ) 
     row.save! 

没有{},并与保存!

你甚至可以用这个尝试,使其更简单:

Entry.create!(row.to_hash) 
1

Entry.create!不需要分配到行,也不需要row.save。也知道'{}'只需要:

Entry.create!(
     :one => row[0], 
     :two => row[1], 
     :three => row[2], 
     :four => row[3], 
     :five =>row[4], 
     :six => row[5], 
     :seven => row[6], 
     :eight => row[7], 
     :nine => row[8], 
     :ten => row[9] 
    ) 

create方法将填充行并保存它。

0

命名空间:CSV做

递减 “导入CSV数据” 任务:c_up =>:环境做

require 'csv' 

csv_file_path = 'db/main.csv' 

CSV.foreach(csv_file_path, :headers => true) do |row| 
    Entry.create!({ 
    :one => row[0], 
    :two => row[1], 
    :three => row[2], 
    :four => row[3], 
    :five =>row[4], 
    :six => row[5], 
    :seven => row[6], 
    :eight => row[7], 
    :nine => row[8], 
    :ten => row[9] 
    }) 
end 

end end