You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:54:37