我正在尝试使用Ruby的csv模块将csv文件中包含的记录导入Ruby on Rails 3应用程序中的本地表。
该表是通过创建模型Movie创建的。
这是我在控制台中执行的内容:
require 'csv'
CSV.foreach('public/uploads/VideoTitles2.csv') do |row|
record = Movie.new(
:media_format => row[0],
:title => row[1],
:copies_at_home => row[2],
:order => row[3]
)
record.save
end
csv文件的行(在数据类型中)匹配它们传入的列。这是我试图导入的csv文件(VideoTitles2.csv)的缩短版本:
"DVD","LEAP OF FAITH",1,1
"DVD","COCOON",1,2
"DVD","TITANIC",1,3
每个记录用\ n分隔\ n我相信。此csv文件是从Access导出的,其原始文件扩展名为.txt。为了导入,我手动将其更改为.csv。
问题是,在rails控制台中执行上述行之后,我得到以下输出:
=> nil
导入似乎没有发生。如果有人知道如何解决这个问题,我真的很感激。
答案 0 :(得分:2)
我没有看到问题。此代码段返回nil
,因为CSV.foreach
返回nil
,但这并不表示循环是否运行。您是否检查过是否创建了Movie
?你是否包括任何调试行来跟踪这个过程?
您可能需要检查record.save
的输出(或调用record.save!
),可能验证错误会阻止创建记录。另外,如果你想让循环返回创建的记录,你可以写这个(Ruby> = 1.8.7):
require 'csv'
records = CSV.foreach('public/uploads/VideoTitles2.csv').map do |media_format, title, copies_at_home, order|
Movie.create!({
media_format: media_format,
title: title,
copies_at_home: copies_at_home,
order: order,
})
end
答案 1 :(得分:1)
好吧有两件事我错了:
导出的csv文件不应该在字符串周围引用 - 我只是删除它们。
感谢tokland,record.save!是必要的(与我正在做的record.save相反) - 验证错误 阻止创建记录。
总而言之,人们可以在创建模型/表Movie后创建以下函数:
class Movie < ActiveRecord::Base
attr_accessible :media_format, :title, :copies_at_home, :order
require 'csv'
def self.import_movies()
CSV.foreach('public/uploads/movies.csv') do |row|
record = Movie.new(
:media_format => row[0],
:title => row[1],
:copies_at_home => row[2],
:order => row[3]
)
record.save!
end
end
end
其中movies.csv如下所示:
Blu-ray, Movie 1, 1, 1
DVD, Movie 2, 1, 2
Blu-ray, Movie 3, 1, 3
然后在控制台中调用此函数:
Movie.import_movies()
并且,正如预期的那样,在控制台中返回的所有内容都将是:
=> nil
检查索引视图(如果已创建索引视图),您应该看到记录已成功导入到影片表中。