Rails通过CSV导入并同时设置字段

时间:2016-11-09 03:12:27

标签: ruby-on-rails csv ruby-on-rails-4

我可以通过CSV导入人员详细信息作为条目。

如果电子表格中没有该行的ID,则会创建该条目,否则会根据ID号更新条目。

最终,我想做的是拥有“创造过程”。如果没有id,则在导入条目时更新字段,否则,请不要管它(每个条目只需要设置一次' CreatedAt'设置一次)。

如果已经有'CreatedAt'设置,我们只是更新,它不需要做什么。

这是我到目前为止的代码:

控制器文件:

def import
 Votsphonebook.import(params[:file])
 redirect_to root_url, notice: "Entries updated!"
end

模型文件:

def self.import(file)
    CSV.foreach(file.path, headers: true) do |row|

        votsphonebook_hash = row.to_hash 
        votsphonebook = Votsphonebook.where(id: votsphonebook_hash["id"])

        if votsphonebook.count == 1
            votsphonebook.first.update_attributes(votsphonebook_hash)
        else

            Votsphonebook.create!(votsphonebook_hash)
        end
    end
end

我只需要在代码中有一个入口点,我可以在其中查看当前行并运行if语句。

谢谢

1 个答案:

答案 0 :(得分:1)

updated_atcreated_at列由Active Record自动填充。没有必要的额外步骤来实现您的目标。

如果要捕获自定义列的当前时间,可以执行以下操作:

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
    votsphonebook_hash = row.to_hash
    votsphonebook = Votsphonebook.find(votsphonebook_hash["id"])

    if votsphonebook
      votsphonebook.update_attributes(votsphonebook_hash.merge(your_custom_column: Time.now))
    else
      Votsphonebook.create!(votsphonebook_hash)
    end
  end
end

请注意,为了清晰起见,我稍微重构了你的取景器。