我知道如何通过使用模型中的has_one_attached将文件附加到我的请求上来上传文件。
但是我的目标是上传CSV文件的内容,而不是文件本身。 (csv文件也有一个我想使用的标头) 如何设置我的控制器和模型以启用此功能?
一些背景信息:我正在使用ETL流程来转换CSV文件,并想在我的API中上传这些CSV文件的内容。有很多大文件要上传,我想避免对文件进行手动更改。
尽管有一个小例子足以解决这个问题:
testfile1.csv
name;age;gender
max;23,m
lisa;12;f
gustavo;69;m
bernd;4;d
我看到了用于CSV文件的此方法,但是我不知道如何实现该方法
CSV.foreach(params[:file].path, headers: true) do |row|
Model.create(name: row[0], age: row[1], gender: row[2])
end
“ Model.create”是否创建了一个新模型,所以我自己的模型不需要名称,年龄和性别,或者它如何工作? 我可以在服务中使用它吗? params [:file]是访问允许的属性的方法吗?
这是我的第一个问题,我经验不足,我希望我能包括所有需要的东西。预先谢谢你
答案 0 :(得分:0)
foreach
方法将使您可以迭代所涉及的csv文件。是的,params[:file]
允许您访问文件(如果它来自表单,则应该是控制器上的允许参数)。根据示例,Model
类中的对象将具有属性-name
,age
,gender
。 Model.create
将使用提供的参数创建一个对象,并将其写入基础数据库。 row
是此处的迭代变量。 row
将遍历csv文件的所有行。仅在提供headers: true
时(如此处),才会读取标头。
答案 1 :(得分:0)
因此,在尝试了一下之后,我为感兴趣的人找到了解决方案,它可能不是最干净的,但似乎对我有用。 “ Testfilemodel”是我保存内容的其他模型。我认为“文件名”可以删除。
class Api::FileuploadsController < ApplicationController
before_action :set_fileupload, only: [:show, :update, :destroy]
require 'csv'
def create
@fileupload = csvmethod
end
private
def file_params
params.require(:fileupload).permit(:filename, :csvfile)
end
def csvmethod
CSV.foreach(file_params[:csvfile].path, headers: true) do |row|
Testfilemodel.create(name: row[0], age: row[1], gender: row[2])
end
end
def set_fileupload
@fileupload = Fileupload.find(params[:id])
end
end
在“ Testfilemodel”模型中,我只有基本索引和显示方法来显示内容。 希望如果其他人也有同样的问题,这会有所帮助。