使用RAKE任务将CSV移动到POSTGRES关系数据库

时间:2016-03-26 02:17:07

标签: ruby-on-rails ruby csv relational-database rake-task

我有以下型号。

post_fork()

使用以下表格架构:

class Lesson < ActiveRecord::Base
  has_many :books
  has_many :vocabularies
  has_many :sentenses
end

class Book < ActiveRecord::Base
  belongs_to :lesson
end

class Vocabulary < ActiveRecord::Base
  belongs_to :lesson
end

class Sentense < ActiveRecord::Base
  belongs_to :lesson
end

我有一个包含15,000课时的CSV文件。 CSV文件在所有课程计划中使用相同的2本书,10个词汇,2个句子的结构。

我的想法就是这样开始的。

Table Lesson [lesson_number, lesson_name]
Table Books [lesson_id, page_start, page_finish]
Table Vocabulary [lesson_id, word, meaning]
Table Sentences [lesson_id, sentence, sentence meaning]

这似乎很直接,但我正在努力:

  1. 如何处理空值。
  2. 有些课程有两本书 (认为第3列有book1,book2是第9列,有时book2是null)
  3. 课程可能有5-10个词汇 (第10栏词汇1,第11栏词汇1意义,第12栏词汇等)
  4. 将此CSV中的数据导入各自的表格的最佳方法是什么?创建多个rake任务来完成每个部分是否更有意义,还是可以一次完成?

    更新 以下是标题行和第一行数据样本的link。 (分享图片有点太长了。)

1 个答案:

答案 0 :(得分:1)

您可能想要创建一个数据对象,以便更轻松地处理CSV数据。将CSV格式与模型创建分离将使整个过程更简单:

csv = CSV.new(body, headers: true, header_converters: :symbol, converters: :all)
data = csv.to_a.map {|row| row.to_hash }

CSV reference

现在我们可以轻松访问每个字段。

data.each do |d|  
  lesson = Lesson.create!(d[:join], ...)
  book = Book.create!(lesson: lesson, page_start:..)
end
&lt; BTW&amp; FWIW,

class Sentense < ActiveRecord::Base

应该是

class Sentence < ActiveRecord::Base