在要求时努力获取CSV报告以进行加载

问题描述

我正在努力使从网页上查看报告成为可能,但我很努力。此任务使用Sidekiq。

当我单击应该带我到达的链接时,出现错误:“找不到'churn_risk_report'的动作Admin::ReportsController。”

在show.html.erb文件的“报告”视图中,我在许多类似的行下方添加<li><%= link_to 'churn Risk Report',churn_risk_report_admin_reports_path %></li>,并带有指向其他报告的链接

我已在我的路线文件的正确位置添加get 'churn_risk_report'

在我的Workers目录中(我认为这是系统的用于Sidekiq作业的Scripts目录的版本),我有一个名为churn_risk_report.rb文件,并且在此文件中,我有以下代码

class churnRiskReport
  include Sidekiq::Worker

  def perform
    csv_temp = Tempfile.new
    puts csv_temp.path
    CSV.open(csv_temp.path,'wb') do |csv|

      csv << ["AAA","BBB","CCC","DDD","EEE","FFF"]

      AccountchurnRisk.all.each do |acr|
        report_data = [acr.aaa,acr.bbb,"#{acr.ccc} #{acr.ccc}",acr.ddd,acr.eee,acr.fff]

        csv << report_data
      end
    end

    report_name = "churn_risk_report"
    file_name = "gggggggggg-#{report_name}-#{DateTime.Now.to_date.strftime("%b-%Y")}.csv".downcase
    bucket_name = 'hhh-reports'
    s3 = AWS::S3.new
    key = "reports/churn_reports/" + File.basename(file_name)
    x = s3.buckets[bucket_name].objects[key].write(:file => csv_temp.path)
  end

end

连续字母=我认为应该保密的代码。这段代码在运行时在Rails控制台中有效,因此我知道该代码有效。

我正在努力完成任务的最后一部分。在Reports控制器中,我定义了churn_risk_report,并仅使用与Worker文件相同的代码进行了复制。我知道这是不正确的,但是我不确定应该在里面放什么。我认为这里应该有一些代码可以在Workers目录中临时创建一个churn_risk_report文件,但是事实并非如此。我还认为应该在某个地方涉及“异步”。

在此先感谢您的帮助!

解决方法

这个答案的底部是我专为基本CSV导出逻辑处理而保留的要点,适用于大多数不需要高性能的情况。通常,我将其用作用户下载他们正在当前查看的数据的CSV副本的一种方式(因此,在S3中进行缓存并不是太实用):https://gist.github.com/MyklClason/f6ac68ca4ce1faa5d655abfb0abe788b

取决于报告的大小,将其保存在S3中可能会过多,但可以用作缓存(或长期存储)的一种方式。在这种情况下,在呈现下载链接(指向S3文件本身)之前,您需要检查报告是否已经存在,如果存在,则直接呈现到AWS的链接,如果不存在,则呈现“生成报告”链接,然后在生成报告后,呈现“下载报告”链接。

如果可以自动生成报告,那就更好了,这似乎就是您在原始代码中所做的。尽管我认为“生成报告”按钮可能会使作业排队以运行代码,但是您可能会每月生成报告,或者您可以确切地知道何时需要创建报告,在这种情况下,“生成报告”按钮可能不是不需要,如果报告已生成,您只需提供一个S3下载链接。

要点:

# Good solution for exporting to CSV in rails.
# Source: https://www.codementor.io/victorhazbun/export-records-to-csv-files-ruby-on-rails-vda8323q0

class UsersController < ApplicationController
  def index
    @users = User.all

    respond_to do |format|
      format.html
      format.csv { send_data @users.to_csv,filename: "users-#{Date.today}.csv" }
    end
  end
end

class User < ActiveRecord::Base
  def self.to_csv
    attributes = %w{id email name}

    CSV.generate(headers: true) do |csv|
      csv << attributes

      all.each do |user|
        csv << attributes.map{ |attr| user.send(attr) }
      end
    end
  end
end

<%= link_to 'Export CSV',user_path(format: :csv) %>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...