Rails Rake 任务 - 通过将模型名称和 ID 作为参数传递来删除记录

Rails Rake Task - Delete records by passing model name and ids as params

我打算编写一个通用的 rake 任务,允许我在将模型名称和 ID 作为输入参数后销毁模型的记录

  #lib/tasks/import.rake

  task :destroy_model_records, [:params] => :environment do |task, args|
    params = args.params.with_indifferent_access
    model = params[:model_name]
    ids = params[:ids]

    model.where(id: ids).destroy_all
  end

这是我的参数的样子:

params = { ids:"[532]", model_name: Shop }

我试过了,但这不是 return 错误消息,也没有执行操作,我在这里错过了什么?

您发送的是字符串作为 ids 参数而不是数组。您的 params 应该如下所示:

params = { ids: [532], model_name: Shop }

尝试使用 Object.const_get(model) 加载模型然后它将读取 'where' 方法应该在其上工作的 class。要验证参数,可以使用puts方法将它们写出来。

#lib/tasks/import.rake

task :destroy_model_records, [:model_name, :ids] => :environment do |t, params|
  puts params[:model_name]
  puts params[:ids]

  model = Object.const_get(params[:model_name])
  ids = params[:ids].split(" ")

  model.where(id: ids).destroy_all
end

任务可以这样完成:

rails import:destroy_model_records[Shop,'1 2 3']

我需要拆分字符串数组,然后将其映射为整数

ids = params[:ids].tr('[]', '').split(' ').map(&:to_i)