[Rails] CSV 가져오기 기능의 실현

목표



개발 환경


・Rubby:2.5.7
・Rails:5.2.4
・Vagrant:2.2.7
・VirtualBox:6.1
・OS:macOS Catallina

전제 조건


다음은 이미 실현되었다.
슬림 가져오기
Bootstrap3 가져오기
발언 기능 설치

이루어지다


1. 젬 도입


Gemfile
# 追記
gem 'roo'
단말기
$ bundle

2. application.편집


application.rb
require_relative 'boot'

require 'rails/all'
require 'csv' # 追記

Bundler.require(*Rails.groups)

module Bookers2Debug
  class Application < Rails::Application
    config.load_defaults 5.2
  end
end

3. 모델 편집


book.rb
def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
    book = find_by(id: row["id"]) || new
    book.attributes = row.to_hash.slice(*updatable_attributes)
    book.save!(validate: false)
  end
end

def self.updatable_attributes
  ['id', 'title', 'body']
end

① 가져온 데이터에서 동일한 ID가 발견되면 레코드를 호출하고 찾을 수 없으면 다시 만듭니다.

book = find_by(id: row["id"]) || new

② CSV 파일에서 데이터를 가져옵니다.

book.attributes = row.to_hash.slice(*updatable_attributes)

③ 인증을 거치지 않고 저장한다.

book.save!(validate: false)

④ CSV 가져오기 시 수신할 열을 설정합니다.

def self.updatable_attributes
  ['id', 'title', 'body']
end

4. 컨트롤러 편집


books_controller.rb
def import
  Book.import(params[:file])
  redirect_to books_path
end

5. 라우팅 추가


routes.rb
resources :books do
  collection { post :import }
end

6. 뷰 편집


books/index.html.slim
= form_tag import_books_path, multipart: true do
  = file_field_tag :file
  br
  = submit_tag "インポート", class: 'btn btn-success'

좋은 웹페이지 즐겨찾기