我做了一个CSV导入器和导出器在铁路的文章模型.它需要的文章,并在CSV格式下载它.它工作正常,但我希望它是在一个backgrond过程.有人能告诉如何执行导入和导出在后台.
这是我用过的文件-
Article_controller
def index
@articles = Article.all
@articles = Article.includes(:user)
respond_to do |format|
format.html # index.html.erb
format.json { render json: @articles }
format.atom
@articles = Article.order(:name).page params[:page]
format.csv { send_data @articles.to_csv, filename: "#{current_user.email}-#{Date.today}.csv" }
end
end
...
article.rb
def self.import(file,userid)
user = User.find_by(id: userid)
if user
CSV.foreach(file.path, headers: true) do |row|
user.articles.create! row.to_hash
end
end
end
def self.to_csv
attributes = %w{id title content}
CSV.generate(headers: true) do |csv|
csv << attributes
all.each do |article|
csv << article.attributes.values_at(*attributes)
end
end
end
2条答案
按热度按时间piok6c0g1#
导入:
导入更容易,因为用户不必在导入完成后接收反馈。
正如在评论中提到的,你可以使用ActiveJob和sidekiq这样的后端:
你可以在你的文章中使用后台工作。rb:
导出:
导出比较棘手,因为您不能从后台作业向用户发送文件。
后台处理与导入类似:
然后你必须创建一个不同的路由来触发CSV的创建。ArticleController#index将总是返回最后导出的CSV,它保存在DB或文件系统中的某个地方。
ovfsdjhp2#
要扩展导出,请务必使用job或Sidekiq worker来生成CSV。
要通知用户作业/员工何时完成,请使用hotwire/turbo广播更新和/或发送电子邮件。
当涉及到交付在作业/工人中生成的csv时,ActiveStorage使其非常容易:
然后像这样将csv字符串附加到模型:
并像这样链接到下载: