Ruby on rails 如何使用CSV头作为请求头在my API中上载CSV文件的内容
我知道如何通过使用模型中的has_one_将文件附加到我的请求来上载文件 但我的目标是上传CSV文件的内容,而不是文件本身。(csv文件还有一个我想使用的标题) 如何设置控制器和模型以启用此功能 一些背景信息:我正在使用ETL过程转换CSV文件,并希望在API中上载这些CSV文件的内容。将有许多大文件上传,我想避免手动更改文件 不过,对于这个问题,一个小例子就足够了: testfile1.csvRuby on rails 如何使用CSV头作为请求头在my API中上载CSV文件的内容,ruby-on-rails,api,csv,Ruby On Rails,Api,Csv,我知道如何通过使用模型中的has_one_将文件附加到我的请求来上载文件 但我的目标是上传CSV文件的内容,而不是文件本身。(csv文件还有一个我想使用的标题) 如何设置控制器和模型以启用此功能 一些背景信息:我正在使用ETL过程转换CSV文件,并希望在API中上载这些CSV文件的内容。将有许多大文件上传,我想避免手动更改文件 不过,对于这个问题,一个小例子就足够了: testfile1.csv name;age;gender max;23,m lisa;12;f gustavo;69;m be
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]是访问允许属性的方式吗
这是我在这里的第一个问题,我相当缺乏经验,我希望我包括所有需要的。提前谢谢使用
foreach
方法可以迭代有问题的csv文件。是,params[:file]
允许您访问该文件(如果该文件来自表单,则应为控制器上允许的参数)。根据该示例,模型
类中的对象将具有属性-名称
,年龄
,性别
Model.create
将使用提供的参数创建一个对象,并将其写入基础数据库<代码>行在这里是一个迭代变量<代码>行将遍历csv文件的所有行。仅当提供了headers:true
时(如此处),才会读取标题 因此,在尝试了一点之后,我为感兴趣的人找到了一个解决方案,它可能不是最干净的,但似乎对我有效。“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
class Api::FileuploadsController
在“Testfilemodel”模型中,我只有基本的索引和显示方法来显示内容。
如果其他人也有同样的问题,希望这能有所帮助。要使其起作用:
Model.create(姓名:行[0],年龄:行[1],性别:行[2])
您需要一个名为Model的模型,该模型具有这些属性Model.create
这只是一个通用示例,如果您有一个名为Car的模型,那么您将执行Car.create
操作,并且您需要模型响应这些属性。如果您想为您的模型提供灵活的模式,可能需要像MongoDB这样的NoSQL数据库。你试过什么了吗?谢谢你的快速回放。我目前正在使用postgresql。所以我需要在我的“汽车”模型中使用另一种创建方法?你能给我举一个如何实现CSV.foreach。。。在控制器中?谢谢你的回答,我仍然不知道如何在控制器中实现它。你能给我举个create方法的例子吗?