我打算编写一个通用的 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 }
我已经尝试过这个,但是这不会返回错误消息,也不会执行操作,我在这里缺少什么?
尝试使用
Object.const_get(model)
加载模型,然后它将读取“where”方法应该起作用的类。要验证参数,您可以使用 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)
您将发送一个字符串作为
ids
参数而不是数组。您的 params
应如下所示:
params = { ids: [532], model_name: Shop }