ruby-on-rails - Rails CSV 导入,添加到相关表

标签 ruby-on-rails csv

我的应用程序上有一个 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/

相关文章:

c - 如何正确地将 CSV 从文本文件加载到 C 中的结构?

python - 访问 collections.defaultdict 的值

ruby-on-rails - Rails:ActionController::ParameterMissing 参数丢失或值为空:

ruby-on-rails - 如何检查 HTTParty 生成的完整 URL?

ruby-on-rails - ruby on rails,由于 bcrypt_ext (LoadError),运行服务器不工作

java - Jackson CSV Writer 抛出 ArrayIndexOutOfBoundsException

python - 计算csv文件中出现在python同一行中的相同单词的出现次数

python - 如何从多个图像中提取单个 RGB channel Python

ruby-on-rails - AASM 由 current_user 保护

javascript - 在 Rails 2.3.x 中获取 Rails 3 样式 UJS 的插件/Gem?