update_all со связью строк
Я пытаюсь обновить поле allow_ips для всех моих пользователей, но оно не работает так, как я ожидаю.
'allow_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"
2 ответа
Решение
Это должно сделать трюк:
User.where(role: 1).update_all(["allowed_ips = CONCAT(allowed_ips, ?)", '192.168.0.1'])
В вашем случае "CONCAT..." считается просто строковым значением для обновленного поля.
Кстати, вам, вероятно, нужно исправить сам вызов CONCAT, иначе строки будут склеены без разделителей.
Также проверьте serialize
( ссылка) для хранения объектов (например, массивов) в атрибутах модели ActiveRecord. Это может быть более чистый способ получить то, что вы хотите достичь
КОНКАТ не должен быть в кавычках. Allow_ips внутри CONCAT не должны быть в кавычках.
User.where(role: 1).update_all("'allowed_ips' = CONCAT(allowed_ips, ', 192.168.0.1')")