Ruby on Rails에서 CSV를 내보내는 방법
Ruby on Rails에서 CSV를 내보내는 것은 간단한 작업이지만,
데이터 필터링? 좋아요, 아마 많은 분들에게는 여전히 쉬울 것입니다. 하지만 저에게는 이것이
내가 작업한 프로젝트의 과속 방지턱이었습니다.
하지만 시작하기 전에 이 프로젝트는 무엇입니까?
에서 제공하는 구독 웹사이트입니다.
Subscription
와 함께 제공되는 Pay RailsUser
모델에 속하는 모델입니다.CMS에서 사용자를 보고 가입 상태별로 필터링할 수 있습니다.
그러나 결과를 내보낼 수는 없습니다. 지금 추가해 보겠습니다.
먼저 약간의 변경이 필요합니다.
사용자 모델
파일 맨 위에
require 'csv'
를 추가했습니다.그리고 이 메서드를 추가하여
제어 장치.
def self.to_csv(records = [])
attributes = %w[email full_name status]
CSV.generate(headers: true) do |csv|
csv << attributes
records.each do |user|
csv << attributes.map { |attr| user.send(attr) }
end
end
end
status
모델에는 User
같은 것이 없으므로다음과 같은 방법:
def status
subscription&.status
end
다음은 필터링에 사용되는 범위입니다.
scope :subscribed, -> { left_outer_joins(:subscriptions).where("subscriptions.status = ?", "active") }
scope :canceled, -> { left_outer_joins(:subscriptions).where("subscriptions.status = ?", "canceled") }
scope :inactive, -> { where(processor: nil) }
보다
현재 페이지 매개변수를 포함하는
link_to
를 추가했습니다.<%= link_to("Download CSV", users_path(request.params.merge(format: :csv))) %>
다음은 필터링에 사용되는 양식입니다.
<%= form_with(url: users_path, local: true, method: :get)) do |f| %>
<%= f.select(:status, [['Subscribed', 'subscribed'], ['Canceled', 'canceled'], ['Inactive', 'inactive']], { selected: params[:status] }) %>
<%= f.submit %>
<% end %>
제어 장치
CSV 형식에 대한 응답을 포함하도록 컨트롤러
index
작업을 업데이트했습니다.def index
@users = User.order(created_at: :desc)
@users = @users.subscribed if params[:status] == 'subscribed'
@users = @users.canceled if params[:status] == 'canceled'
@users = @users.inactive if params[:status] == 'inactive'
csv_name = [(params[:status].present? ? params[:status] : 'all'), 'users', Date.today].compact.join('-')
respond_to do |format|
format.html
format.csv { send_data User.to_csv(@users), filename: "#{csv_name}.csv" }
end
end
이것은
User
모델에서 생성된 범위를 사용하여 @users
인스턴스를 필터링합니다.변수, 전달된 매개변수가 없는 경우 기본값은 첫 번째입니다
@users
.모든 사용자를 반환하는 선언.
더 나은 이름 지정을 위해 생성된 변수
csv_name
가 있습니다.subscribed-users-2021-01-01.csv
canceled-users-2021-01-01.csv
inactive-users-2021-01-01.csv
그리고 그것이 내가 해야 할 전부였습니다. 결국에는 꽤 쉬웠고 분명히
고객에게 많은 가치를 추가했습니다. 어떻게 해야 할지 잘 모르겠지만 제 자리는 아닙니다.
논쟁하다.
Reference
이 문제에 관하여(Ruby on Rails에서 CSV를 내보내는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/markmead/how-to-export-a-csv-in-ruby-on-rails-5h1n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)