update_all with string concatenate

时间:2013-10-04 12:55:11

标签: mysql ruby ruby-on-rails-3.2 update-all

我正在尝试为所有用户更新'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"

2 个答案:

答案 0 :(得分:5)

这应该可以解决问题:

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

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

顺便说一句,你可能也需要自己修复CONCAT调用,否则字符串将粘在一起而没有分隔符。

同时检查serializelink)是否在ActiveRecord模型属性中存储对象(例如数组)。这可能是一种更清晰的方式来实现您想要实现的目标

答案 1 :(得分:1)

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

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