从源自csv的值数组中保存我的rails对象

时间:2015-03-16 22:18:34

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

我目前正在尝试通过csv上传来更新属性。

我的方法如下:

def upload_csv
  CSV.parse(params[:file].read, headers: true) do |row|
    foo = Foo.find_by_id(row.to_hash["id"])
    row.to_hash.each do |v|
       if Foo.new.has_attribute?(v[0]) && v[0] != "id"
         foo.update_attributes()
       end
     end
  end
end

当它跳转到我想更新我的属性的地方时,我得到的数组看起来像这样:

["bar", "22"]

如何将该值保存到我的foo对象?

1 个答案:

答案 0 :(得分:0)

好的,所以阅读你的代码我得出的结论是,你的问题实际上是你的CSV可能包含一些不在你模型中的字段:

def upload_csv
  excluded = %w/id created_at updated_at/
  CSV.new( params[:file], headers: true) do |row|
    rh = row.to_hash
    foo = Foo.find_by id: rh['id']
    foo.update! rh.slice(*foo.attribute_names).except(*excluded)
  end
end

请注意,我假设params[:file]是来自表单的上传文件,在这种情况下它是IO对象,因此可以传递到CSV.new直接(无需将其全部读入内存并将其传递给CSV.parse)。