2013-10-04 30 views
1

我正在尝试为我的所有用户更新'allowed_ips'字段,但它不像我期望的那样工作。带字符串连接的update_all

'allowed_ips'是一个带有ip地址的字符串。

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

# output: 
> user.allowed_ips 
=> "CONCAT('allowed_ips', '192.168.0.1')" 

我要的是:

UPDATE 'users' SET 'allowed_ips' = CONCAT('allowed_ips', '192.168.0.1') WHERE 'role' = '1' 
# output: 
> user.allowed_ips 
=> "127.0.0.1, 127.0.0.2, 192.168.0.1" 

回答

4

这应该做的伎俩:

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

在你的情况 “CONCAT ......” 被认为只是一个更新字段的字符串值。

顺便说一句,您可能还需要修正CONCAT调用本身,否则字符串将粘在一起而没有分隔符。

还检查serializelink)用于在ActiveRecord模型属性中存储对象(例如数组)。这可能是一个更清晰的方式来获得你想要达到的目标

+0

谢谢!这工作:User.where(role:1).update_all(“allowed_ips = CONCAT(allowed_ips,'new_ip')”) – Evgeny

1

CONCAT不应该在引号中。 CONCAT中的allowed_ips不应该用引号引起来。

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