Как загрузить содержимое файла CSV в мой API, используя заголовок CSV в качестве заголовка запроса - PullRequest
0 голосов
/ 20 октября 2019

Я знаю, как загружать файлы, прикрепляя файл к моему запросу, используя has_one_attached в модели.

Но моя цель - загрузить содержимое моего CSV-файла, а не сам файл. (у файла csv также есть заголовок, который я хотел бы использовать) Как настроить контроллер и модель, чтобы включить это?

Немного справочной информации: я использую процесс ETL для преобразования файлов CSV и хотел бызагрузить содержимое этих файлов CSV в моем API. Будет загружено много больших файлов, и я хотел бы избежать внесения изменений в файл вручную.

Для этого вопроса достаточно небольшого примера:

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] способом доступа к разрешенным атрибутам?

Это мой первый вопрос, и я довольно неопытен, надеюсь, я включил все необходимое. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Так что, попробовав немного, я нашел решение для тех, кто заинтересован, оно может быть не самым чистым, но мне кажется, что оно работает. «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" у меня есть только базовый индекс и показать методы для отображения содержимого. Надеюсь, это поможет, если у других будет такая же проблема.

0 голосов
/ 21 октября 2019

Метод foreach позволит вам повторить рассматриваемый CSV-файл. Да, params[:file] позволяет вам получить доступ к файлу (должен быть разрешенным параметром на контроллере, если он поступает из формы). Согласно примеру, объекты в классе Model будут иметь атрибуты - name, age, gender. Model.create создаст объект с предоставленными параметрами и запишет его в базовую базу данных. row здесь итерационная переменная. row будет перебирать все строки файла CSV. Только если указан headers: true (как здесь), заголовки будут прочитаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...