Redmine Rake任务显示保存成功但未更新问题自定义字段值求助
解决Redmine Rake任务自定义字段不更新的问题
你遇到的核心问题是直接修改custom_field_values的value属性后,ActiveRecord没有检测到这个变更——这就是为什么调用issue.save后提示成功,但数据库里自定义字段没变化、也看不到事务日志的原因。
Redmine的Issue模型提供了专门的API来处理自定义字段更新,用官方方法能避免这类隐性问题。下面是修正后的Rake任务代码:
namespace :redmine do namespace :myplugin do desc 'Updates custom field for idle tickets.' task :update_idle => :environment do Issue.open.each do |issue| begin # 简化空闲天数计算,避免多余的类型转换 days = (DateTime.now.to_time - issue.updated_on.to_time) / 86400 next if days <= 0 # 使用Redmine官方方法设置自定义字段,确保变更被正确检测 issue.set_custom_field_value(19, days.ceil) if issue.save puts "#{issue.id} saved" else # 增加错误信息输出,方便排查保存失败的原因 puts "#{issue.id} not saved - #{issue.errors.full_messages.join(', ')}" end rescue => e # 捕获异常,避免单个任务失败导致整个脚本终止 puts "Error processing issue #{issue.id}: #{e.message}" end end end end end
关键修改说明:
- 替换直接修改
cfv.value的方式,改用issue.set_custom_field_value(19, days.ceil):这个方法会主动标记自定义字段为"脏属性",确保save操作时能触发数据库更新。 - 简化了天数计算逻辑:
issue.updated_on本身就是时间对象,无需额外用DateTime.parse转换。 - 增加了错误捕获和详细日志:避免单个工单处理失败导致整个任务中断,同时方便定位问题。
- 优化了流程判断:用
next if days <=0替代嵌套的if结构,代码更简洁易读。
为什么控制台执行正常?
控制台的交互模式下,ActiveRecord的变更检测机制会因为对象被反复访问而自动触发脏属性标记;但在非交互的Rake任务环境中,这种隐式检测不会生效,必须用显式的API来修改字段。
内容的提问来源于stack exchange,提问作者Aleksandar Pavić
相关产品推荐
相关产品推荐

