我的应用程序上有一个 csv 导入系统(仅在本地使用),它逐行解析 csv 文件并将数据添加到数据库表中。这是基于教程 here .
require 'csv'
def csv_import
@parsed_file=CSV::Reader.parse(params[:dump][:file])
n = 0
@parsed_file.each_with_index do |row, i|
next if i == 0 #ignore the first row
course = Course.new
course.title = row[0]
course.unit_code = row[1]
course.course_type = row[2]
course.value = row[3]
course.pass_mark = row[4]
if course.save
n = n+1
GC.start if n%50==0
end
flash.now[:message] = "CSV Import Successful, #{n} new courses added to the database."
end
redirect_to(courses_url)
end
这一切都在类(class) Controller 中,并且工作正常。类(class) HABTM 年和 HABTM 类(class)是有关系的。在 csv 文件中(实际上在 row[5] 到 row[8])是 year_id s。有没有办法可以在上面的方法中添加它。我对如何遍历 4 个项目并将它们添加到 course_years 表感到困惑。
谢谢
jack
最佳答案
您可以通过在将“正常”数据添加到模型后添加一个简单循环,并使用 << 方法附加到年份关联来完成此操作。
...
course.value = row[3]
course.pass_mark = row[4]
5.upto(8).each do |i|
one_year = Year.find(row[i])
course.years << one_year if one_year
end
if course.save
n = n+1
...
如果您想确保这些值有效,和/或更改查找以另一种方式定位您的年份,您可以在循环中添加更多检查。当相关数据像这样“拖到最后”时,另一种方法是继续添加,直到没有任何可添加的内容,如果尚不存在,还添加年份本身:
...
course.value = row[3]
course.pass_mark = row[4]
row[5..-1].each do |year_id|
one_year = Year.find_or_create_by_id(year_id)
course.years << one_year
end
if course.save
n = n+1
...
有很多不同的方法可以做到这一点,正确的方法实际上取决于您的实际数据,但这是基本方法。
关于ruby-on-rails - Rails CSV 导入,添加到相关表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2827209/