Ruby on Rails:用户未从 postgres 数据库中删除
Ruby on Rails: User not deleting from the postgres database
我正在开发一个使用 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
谁能告诉我代码有什么问题?为什么它不起作用?
如有任何帮助,我们将不胜感激。
你能试试吗
Application::RecordsDestroy.perform_async('Application::User', ids)
由于您使用的是 constantize,我认为您的工作需要字符串作为参数。
您也可以检查您的 sidekiq 日志是否有错误
这似乎是使用 Sidekiq 时的典型错误。请参阅作业参数 best practices。
您不能直接传递 AR 模型或复杂对象,因为 Sidekiq 无法正确序列化它们。相反,您必须传递一个原语,例如字符串:
Application::RecordsDestroy.perform_async 'Application::User', ids
调试 Sidekiq 的相关提示:添加
require 'sidekiq/testing'
Sidekiq::Testing.inline!
到您的应用程序初始化(例如 development.rb
),这将使您的作业 运行 在您的主进程中同步。
我正在开发一个使用 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
谁能告诉我代码有什么问题?为什么它不起作用?
如有任何帮助,我们将不胜感激。
你能试试吗
Application::RecordsDestroy.perform_async('Application::User', ids)
由于您使用的是 constantize,我认为您的工作需要字符串作为参数。
您也可以检查您的 sidekiq 日志是否有错误
这似乎是使用 Sidekiq 时的典型错误。请参阅作业参数 best practices。
您不能直接传递 AR 模型或复杂对象,因为 Sidekiq 无法正确序列化它们。相反,您必须传递一个原语,例如字符串:
Application::RecordsDestroy.perform_async 'Application::User', ids
调试 Sidekiq 的相关提示:添加
require 'sidekiq/testing'
Sidekiq::Testing.inline!
到您的应用程序初始化(例如 development.rb
),这将使您的作业 运行 在您的主进程中同步。