使用Rails update_all方法更新具有另一列值的字段

sim*_*ley 6 activerecord ruby-on-rails ruby-on-rails-3

我正在尝试使用update_all更新字段.但是我需要从另一个字段中获取值,该字段将重新写入我的特定格式.

如果我的模型中有这样的东西:

 def self.clean_mac_address()
   clean_mac_address = :macaddress.gsub(/[^0-9a-z]/i, '')
 end
Run Code Online (Sandbox Code Playgroud)

当我运行这个:

 Radacct.update_all("mac_clean = #{clean_mac_address}")
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

 NoMethodError: undefined method `gsub' for :macaddress:Symbol
Run Code Online (Sandbox Code Playgroud)

有什么想法我怎么能这样做?或者有更简单的方法来更新该字段?

Fre*_*ung 12

update_all 生成一个单独的SQL查询来运行 - 它不能做一些聪明的事情,如将任意位的ruby更改为等效的SQL.

您需要加载所有实例(find_each例如通过)并逐个修复它们(即不要使用update_all),例如

Foo.find_each do |foo|
  # update foo here
  foo.save!
end      
Run Code Online (Sandbox Code Playgroud)

或者找到一种在SQL中表达清理操作的方法.例如Postgres有一个regexp_replace功能

Foo.update_all("some_column = regexp_replace(some_column, 'your_regexp_here', '','g')")
Run Code Online (Sandbox Code Playgroud)

哪个会删除替换正则表达式的所有内容.显然,您需要检查数据库的文档,看它是否支持这样的功能.