我正在尝试为所有用户更新'allowed_ips'字段,但它没有按预期工作。
'allowed_ips'是带有ip-addresses的字符串。
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"
答案 0 :(得分:5)
这应该可以解决问题:
User.where(role: 1).update_all(["allowed_ips = CONCAT(allowed_ips, ?)", '192.168.0.1'])
在您的情况下" CONCAT ......"被认为只是更新字段的字符串值。
顺便说一句,你可能也需要自己修复CONCAT调用,否则字符串将粘在一起而没有分隔符。同时检查serialize
(link)是否在ActiveRecord模型属性中存储对象(例如数组)。这可能是一种更清晰的方式来实现您想要实现的目标
答案 1 :(得分:1)
CONCAT不应该引用。 CONCAT中的allowed_ips不应该在引号中。
User.where(role: 1).update_all("'allowed_ips' = CONCAT(allowed_ips, ', 192.168.0.1')")