新手问题 导入一张 CSV,一对一,和一对多的数据如何导入三个表中?

QueXuQ · 发布于 2013年01月20日 · 最后由 yorzi 回复于 2013年01月20日 · 1426 次阅读
3547

正常的导入有Project所有字段的CSV,Model的方法如下:

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
    Project.create! row.to_hash
  end
end

Project和Order之间有一对一的关系,User和Project是一对多,三个表,如:

Order:
amount
project_id

Project:
name
price
user_id

User:
name

CSV表的结构:

name    |      price      |      amount   |   user_name

无法知道user_name那一列有多少是重复的,User和Project是一对多,而且三个表都是没有创建的。 请问怎么可以实现一张表上传就可以把数据存入三个表中呢?

共收到 3 条回复
42

FYI

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
     name, price, amount = row
     project = Project.create!(name: name, price: price)
     order = project.orders.create!(amount: amount)
  end
end
3547

#1楼 @yorzi 谢谢。第一次发现hash可以这样用:

name, price, amount = row

我根据你这个思路,又多加了一个user_name在CSV上,但是有大量的重复,因为是一对多,请问应该怎么重新设计这个self.import方法好呢? 不好意思,想了好久都想不到,所以才问问你,因为不知道怎么剔除那些CSV里的重复的user_name

42

重复的user_name可以先搜一下,如果没有才创建新的user

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
     name, price, amount, user_name = row
     user = User.where(username: user_name).first_or_create
     project = user.projects.create!(name: name, price: price)
     order = project.orders.create!(amount: amount)
  end
end
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册