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

QueXuQ · 2013年01月20日 · 最后由 yorzi 回复于 2013年01月20日 · 2993 次阅读

正常的导入有 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 是一对多,而且三个表都是没有创建的。 请问怎么可以实现一张表上传就可以把数据存入三个表中呢?

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

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

name, price, amount = row

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

重复的 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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号