【问题标题】:Rails Active job downloaded file not deleted by controller destroy action控制器销毁操作未删除 Rails 活动作业下载文件
【发布时间】:2019-09-06 13:48:59
【问题描述】:

我刚刚开始学习 Rails,但遇到了一个问题:

我正在开发一个简单的 RoR 应用程序,它有一个文本表单和一个使用活动存储的图像上传,它在提交时创建一个(发布)并激活一个活动作业,该作业在后台创建一个 MySql 转储并将其存储到一个目录中。

我的问题是,当我删除(发布)时,除了生成的 dump.sql 之外,所有内容都被删除。所以我希望能够单击删除并删除与我的帖子相关的所有内容,包括转储。所以我想我必须以某种方式将这个通过活动作业在后台生成的新 dump.sql 文件与我的帖子相关联。

这是我调用活动作业的控制器创建操作。

def create
    @post = Post.new(post_params)
    if @post.save
        redirect_to home_path
        DumpSaveJob.perform_later
    else
        render 'new'
    end
end

这是在后台生成 Dump 的活动作业:

class DumpSaveJob < ApplicationJob 
    queue_as :default

    def perform(*args)
        `/usr/local/mysql/bin/mysqldump -u root mypassword dump_app_development > storage/dumps/dump-$(date +%Y-%m-%d-%H-%M-%S).sql` 
    end
end

这里是销毁控制器动作:

def destroy
    @post = Post.find(params[:id])
    @post.destroy
    redirect_to home_path
end

我希望 Rails 直接将活动作业转储文件与我的控制器操作(具体销毁)相关联,因为该作业是从控制器中的创建操作中调用的。

【问题讨论】:

    标签: ruby-on-rails rails-activejob


    【解决方案1】:

    任何人都无法知道哪些帖子和 SQL 转储相关。首先,我不确定您是否真的想在创建新记录时对整个数据库进行完整转储,但如果确实如此,则应该这样做:

    1. 将帖子对象传递到您的后台作业中
    2. 在帖子表中创建一个文本列来存储关联 SQL 转储的文件名
    3. 创建转储后,将文件名存储在帖子中
    4. 在您的帖子中创建一个 after_destroy 钩子并将新作业排入队列以删除 SQL 转储文件(将名称传递到作业中,因为您的帖子将不再存在)

    为此,您可能还想在 ruby​​ 中生成文件名,例如使用帖子 ID,因此 a) 您可以更轻松地将其存储在帖子模型中,并且 b) 当同时创建 2 个帖子时不会有任何问题。

    只有当您使用ActiveStorage 存储与记录关联的文件时,rails 才会知道(并自动为您删除文件)。您也可以这样做,特别是如果您想将此文件存储在 S3 等外部存储设备上。请注意,这不会触及您当前在 storage/dumps 中创建的原始文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多