Mysql 使用字符串连接更新\u all

Mysql 使用字符串连接更新\u all,mysql,ruby,ruby-on-rails-3.2,update-all,Mysql,Ruby,Ruby On Rails 3.2,Update All,我正在尝试为我的所有用户更新“allowed_ips”字段,但它没有像我预期的那样工作 “allowed_ips”是一个带有ip地址的字符串 User.where(角色:1).update_all(:allowed_ips=>[“CONCAT('allowed_ips','192.168.0.1')”) #输出: >user.allowed\u IP =>“CONCAT('allowed_ips','192.168.0.1')” 我想要的是: UPDATE'users'SET'allowed_

我正在尝试为我的所有用户更新“allowed_ips”字段,但它没有像我预期的那样工作

“allowed_ips”是一个带有ip地址的字符串

User.where(角色:1).update_all(:allowed_ips=>[“CONCAT('allowed_ips','192.168.0.1')”)
#输出:
>user.allowed\u IP
=>“CONCAT('allowed_ips','192.168.0.1')”
我想要的是:

UPDATE'users'SET'allowed_ips'=CONCAT('allowed_ips','192.168.0.1'),其中'role'='1'
#输出:
>user.allowed\u IP
=> "127.0.0.1, 127.0.0.2, 192.168.0.1"

这应该可以做到:

User.where(role: 1).update_all(["allowed_ips = CONCAT(allowed_ips, ?)", '192.168.0.1'])
在您的例子中,“CONCAT…”被认为只是更新字段的字符串值

顺便说一句,您可能还需要修复CONCAT调用本身,否则字符串将在没有分隔符的情况下粘合在一起


还要检查
serialize
()以在ActiveRecord模型属性中存储对象(例如数组)。这可能是一种更干净的方式来实现您想要的目标

这应该可以做到:

User.where(role: 1).update_all(["allowed_ips = CONCAT(allowed_ips, ?)", '192.168.0.1'])
在您的例子中,“CONCAT…”被认为只是更新字段的字符串值

顺便说一句,您可能还需要修复CONCAT调用本身,否则字符串将在没有分隔符的情况下粘合在一起


还要检查
serialize
()以在ActiveRecord模型属性中存储对象(例如数组)。这可能是一种更简洁的方式,可以实现您想要实现的目标。CONCAT中允许的\u IP不应包含在引号中

User.where(role: 1).update_all("'allowed_ips' = CONCAT(allowed_ips, ', 192.168.0.1')")

CONCAT不应使用引号。CONCAT中允许的\u IP不应包含在引号中

User.where(role: 1).update_all("'allowed_ips' = CONCAT(allowed_ips, ', 192.168.0.1')")

非常感谢。这是有效的:User.where(角色:1).update_all(“allowed_ips=CONCAT(allowed_ips,'new_ip')))。如何通过检查串接值是否已经存在于字符串中,如果存在,则不进行串接,如果没有,则进行串接。谢谢!这是有效的:User.where(角色:1).update_all(“allowed_ips=CONCAT(allowed_ips,'new_ip'))”)如何通过检查串接的值是否已经存在于字符串中,如果存在则不进行串接,如果不存在则执行。