Ruby Activerecord中的组合更新

Ruby Activerecord中的组合更新,ruby,activerecord,Ruby,Activerecord,在Ruby Activerecord(而不是Rails)中有没有更好的方法来进行多次更新?我不想重复所有的记录,并使用if或case # reset all color fields to null Signal.where.not(color: nil).update_all("color = null") # set color field based on status Signal.where(status: CONFIG.status.step3).update_all("color

在Ruby Activerecord(而不是Rails)中有没有更好的方法来进行多次更新?我不想重复所有的记录,并使用if或case

# reset all color fields to null
Signal.where.not(color: nil).update_all("color = null")
# set color field based on status
Signal.where(status: CONFIG.status.step3).update_all("color = 'o'")
Signal.where(status: CONFIG.status.step4).update_all("color = 'r'")
Signal.where(status: CONFIG.status.manual).update_all("color = 'y'")

也许您可以做得更多,在
update\u all
中使用散列样式作为参数,而不是字符串:

# reset all color fields to null
Signal.where.not(color: nil).update_all(color: nil)
# set color field based on status
color_dependencies = {
  CONFIG.status.step3 => 'o', 
  CONFIG.status.step4 => 'r', 
  CONFIG.status.manual => 'y'
}

color_dependencies.each do |status, color| 
  Signal.where(status: status).update_all(color: color) 
end

我的情况更糟,但颜色的数量可能会增加,代码中的重复也不好,而且如果有一种方法可以在一次更新中完成所有事情(并保持可读性),它将执行fastermore DRY yes,但不能对颜色依赖项使用常量,否则会出现错误“动态常量赋值”,更新仍然是一个接一个的,但也值得注意的是,这将是包装在
Signal.transaction do中的一个很好的候选者。。。结束
以确保这是一次性完成的,而不是因为任何原因而中途停顿或被同一代码的其他实例绊倒。@peter,你说得对。我用变量替换了它,因此如果需要,可以在以后的代码中修改
color\u依赖项。现在我要接受你的回答,因为它至少给出了部分答案sollution@peter您还可以像@tadman said(更多信息:)一样将其包装在Signal.transaction中。在这种情况下,它将比执行单独的
update\u all
查询更快,因为所有请求都将在单个数据库
BEGIN…COMMIT
块中完成,而不是在多个数据库中完成。这是更安全的,因为如果出现问题,它将被回滚。以下是mysql中的更多内容: