我目前正在尝试通过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对象?
答案 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
)。