首页 > 解决方案 > 脚本来更新rails中的字段

问题描述

我有一个包含父母及其子女数据的 csv 文件。父母有很多子女关联。我想要的是如果 family_situation/gross_income 或两者对于不同的孩子不同,我希望将该父母的最后一个 family_situation/gross_income 保存到数据库中。就像在下面的这种情况下,我希望family_situation 是“三口之家”,总收入是“16775”。我目前在我的父模型中拥有的内容如下。我怎样才能做到这一点,请帮忙。

父.rb

def self.import(file)
  CSV.foreach(file.path, headers:true) do |row|
    parent = Parent.find_or_create_by(
        parent_1_firstname: row["parent_1_firstname"],
        parent_1_lastname: row["parent_1_lastname"],
        family_situation: row["family_situation"],
        gross_income: row["gross_income"],
   )

        parent.children.find_or_create_by(
        firstname: row["firstname"],
        gender: row["gender"]

   )
        end
    end

父.csv

parent_1_firstname,parent_1_lastname,family_situation,gross_income,childfirstname,childgender
Josh,Wilson,"family of two",13000,Jessica,Female
Josh,Wilson,"family of three",16775,Jamie,Male

标签: ruby-on-railscsvruby-on-rails-5csv-import

解决方案


As you want to save only last value for family_situation and gross_income you can just find existing parent and update it:

parent = Parent.find_or_initialize_by(
  parent_1_firstname: row["parent_1_firstname"],
  parent_1_lastname: row["parent_1_lastname"]
).tap do |p|     
  p.family_situation = row["family_situation"]
  p.gross_income = row["gross_income"]
  p.save
end

Here you're trying to find a parent with particular first&last names. If it exists, it is instantiated, if not - it is builded with given names. After it you're assigning family_situation and gross_income and save the instance.


推荐阅读