【问题标题】:Ruby on Rails: User not deleting from the postgres databaseRuby on Rails:用户未从 postgres 数据库中删除
【发布时间】:2021-01-13 10:33:00
【问题描述】:

我正在开发一个使用 ActiveAdmin 的 ROR 应用程序。我正在尝试使用批处理操作删除用户。它显示了成功的消息,但实际上它并没有从数据库(postgres)中删除用户。

这是批处理操作的代码-

batch_action :destroy, :confirm => "Are you sure you want to delete the user?", do |ids|
   Application::RecordsDestroy.perform_async Application::User, ids
   redirect_to user_path, :notice => "User is deleted"
   end

这是记录销毁文件的代码-

  class RecordsDestroy
    include Sidekiq::App

    def perform(res_model, ids)
      records = res_model.constantize.where(id: ids).destroy_all
      Rails.logger.info "Records for model #{res_model} have been premanently deleted"
    end
  end

谁能告诉我代码有什么问题?为什么它不起作用?

任何形式的帮助都将不胜感激。

【问题讨论】:

  • 您指的是哪个“成功”消息? “用户已被删除”或“模型 #{res_model} 的记录已被预先删除”?如果您没有看到“xxx 的记录”,则可能是后台作业没有排入 Redis。
  • @Ali 我收到的成功消息是“用户被删除”。
  • 尝试在 Rails 控制台中运行您的后台作业,并查看 Sidekiq 日志中是否记录了“模型 xxx 的记录”。

标签: ruby-on-rails postgresql activeadmin record destroy


【解决方案1】:

你可以试试

Application::RecordsDestroy.perform_async('Application::User', ids)

由于您使用的是常量化,我认为您的工作需要字符串作为参数。

您还可以检查 sidekiq 日志是否有错误

【讨论】:

    【解决方案2】:

    这似乎是使用 Sidekiq 时的一个典型错误。有关作业参数,请参阅 best practices

    您不得直接传递 AR 模型或复杂对象,因为 Sidekiq 无法正确序列化。相反,您必须传递一个原语,例如字符串:

    Application::RecordsDestroy.perform_async 'Application::User', ids
    

    Sidekiq 调试相关提示:添加

    require 'sidekiq/testing'
    Sidekiq::Testing.inline!
    

    到您的应用程序初始化(例如development.rb),这将使您的作业在您的主进程中同步运行。

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 1970-01-01
      • 2018-07-12
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多