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')")
Другие вопросы по тегам