Ruby on Rails에서 CSV를 내보내는 방법

9725 단어 rubyrails
이것은 내가 업데이트한 오래된 게시물이며 더 이상 Ruby on Rails를 사용하지 않습니다.

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

  • 그리고 그것이 내가 해야 할 전부였습니다. 결국에는 꽤 쉬웠고 분명히
    고객에게 많은 가치를 추가했습니다. 어떻게 해야 할지 잘 모르겠지만 제 자리는 아닙니다.
    논쟁하다.

    좋은 웹페이지 즐겨찾기