Как передать значение переменного параметра с помощью метода update_all() в Rails?

#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 Хороший вызов. Обновлен ответ.