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