如何导入具有关联的两个csv文件?

时间:2019-01-11 09:30:01

标签: ruby-on-rails csv import

我有两个CS文件,一个叫Articles,另一个叫Reviewsreview文件与articles的关联不是通过ID,而是通过称为article_reference的事物。如何将关联设置为不同于ID的内容?

因此,在控制台中,我使用articles创建了rails g model Article name content article_reference模型。
接下来,我像这样创建了reviews模型: rails g model Review grade comment article_reference article:references

这是我的模特:

Article.rb

class Article < ApplicationRecord
  self.primary_key = "reference_article"
  has_many :reviews
end

Review.rb

class Review < ApplicationRecord
  belong_to :site, primary_key: 'reference_article'
end

由于执行rake任务,我将文章数据导入数据库:

desc "Importing articles from CSV"
task import_site: :environment do
  path = Rails.root.join('lib', "articles.csv")

  CSV.foreach(path, :headers => true, encoding: "UTF-8") do |row|
    Articles.create(row.to_hash)
  end
end

  desc "Importing reviews from CSV"
  task import_reviews: :environment do
    path = Rails.root.join('lib', "reviews.csv")

    CSV.foreach(path, :headers => true, encoding: "UTF-8") do |row|
      row["reference_article"] = "reference_article"
      Review.create(row.to_hash)#Model is the name of your model
    end
  end

这是我的schema.rb

  create_table "parts", force: :cascade do |t|
    t.string "reference_part"
    t.string "reference_site"
    t.string "part_type_designation"
    t.bigint "site_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["site_id"], name: "index_parts_on_site_id"
  end

  create_table "sites", force: :cascade do |t|
    t.string "reference_site"
    t.string "nom"
    t.string "address_line1"
    t.integer "zipcode"
    t.string "city"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_foreign_key "parts", "sites"
end

从文章导入数据的任务很好,但是对于评论来说,它是空的。

所以我看了很多不同的教程,但似乎没人能用(因为它太旧或不适用于我的问题)。

我希望将两个文件导入到我的数据库中,并将review模型与我的article模型相关联。

如果有人看到我的代码有什么问题,我将不胜感激!

非常感谢

更新

通过以下操作,我成功导入了我的review文件:

task import_reviews: :environment do
  filename = Rails.root.join('lib', "reviews.csv")

  CSV.foreach(filename, :headers => true, encoding: "UTF-8") do |row|
    row["reference_article"] = :reference_article
    Review.create!(row.to_hash)#Model is the name of your model
  end
  puts "Reviews added"
end

在我的optional: true的{​​{1}}中添加一个belongs_to :article

但是,我的数据库中仍然有一个 review.rb

0 个答案:

没有答案