2013-10-04 26 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')")