#mysql #ruby-on-rails
#mysql #ruby-on-rails
Вопрос:
Я пытаюсь использовать метод #update_all для массового обновления огромного количества данных с высокой скоростью в задаче rake. Я должен обновить поля электронной почты и телефона. Для поля телефона легко установить значение «00000000000». В поле email я хочу взять имя, сохраненное в поле first_name, и добавить «@email.com «. Я пробовал подобные вещи:
User.update_all(email: "#{User.first_name}" "@email.com", phone: "00000000000")
Но это не работает. Есть идеи?
Ответ №1:
User.update_all("email = first_name || '@email.com', phone = '00000000000'")
||
будет объединять строки. Имя каждого пользователя будет объединено с @email.com и присвоите его полю электронной почты.
Комментарии:
1. Это не работает. Это то, что я получаю в консоли rails при выполнении этой строки:
User id: 3, first_name: "rick", second_name: "smith", email: "0", phone: "555-555-5555"
2. Но я мог бы заставить его работать, используя это:
User.update_all("email = first_name || '@email.com' ,phone = '00000000000'")
3. Эта строка выполняется как часть запроса, поэтому она будет работать только в том случае, если база данных ее поддерживает. Предполагая, что база данных postgres, тогда ей нужно a
,
вместоAND
.4. Хорошо, тогда я понимаю, что если я использую MySQL, я должен использовать И вместо запятой, верно?
Ответ №2:
Другой вариант, предполагающий, что вы используете базу данных, которая поддерживает CONCAT()
функцию (что большинство делает):
User.update_all("email = CONCAT(first_name, '@email.com'), phone = '00000000000'")
Комментарии:
1. Это также будет работать в MySQL, MariaDB, более новых версиях MSSQL, поскольку все они поддерживают эту
CONCAT()
функцию2. @engineersmnky Хороший вызов. Обновлен ответ.