1

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

'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

2 回答 2

6

这应该可以解决问题:

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

在您的情况下,“CONCAT ...”被认为只是更新字段的字符串值。

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

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

于 2013-10-04T13:25:40.887 回答
1

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

User.where(role: 1).update_all("'allowed_ips' = CONCAT(allowed_ips, ', 192.168.0.1')")
于 2013-10-04T13:36:13.690 回答