Как обновить рельсовые записи в БД - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть приложение rails. У меня есть таблица User и столбец Number, который является строкой. Некоторые пользователи сохранили свой телефонный номер с пробелами (например, 1234 1234), и теперь я хочу удалить пробел из своих телефонных номеров.

Я попробовал это, но это не сработало:

space = " "
phones = User.where("number like ?", "%#{space}%").pluck(:number)
phones.each do |phone|
  phone = phone.gsub(/\s+/, "")
  phone.save
end

Я получил ошибку NoMethodError: undefined method 'save' Как я могу сделать это правильно?

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018

Вам нужен объект user, чтобы сохранить его. Читайте встроенные комментарии ниже

space = " "
users = User.where("number like ?", "%#{space}%") # collect users with number having space character here. 
# then iterate on those users
users.each do |user|
  user.number = user.number.gsub(/\s+/, "") # notice here, changing the phone number of that user
  user.save # and saving that user with the updated `number`
end
0 голосов
/ 05 сентября 2018

Способ, который вы могли бы сделать, - создать задачу rake для обновления существующих записей в системе.

namespace :update do
  desc 'Strip space from existing numbers from Users'
  task(:number => ::environment) do
   space = ' '
   numbers_with_space = User.where("number like ?", "%#{space}%")
   numbers_with_space.each do |a|
     a.number = a.number.gsub!(/\s+/, '')
     a.save(validate: false) # You would like to use 
                             # validate false in order
                             # to stop other validation from updating the record.
   end
end

Затем выполните грабли.

bundle exec rake update:number

Еще один способ сделать это заранее - переформатировать номер во время проверки. Таким образом, вам не нужно будет запускать задачу или код rake для переформатирования и сохранения при вводе новых данных в приложение.

class User < ApplicationRecord
 before_validation :reformat_number, on: [:create, :update]

 private

 def reformat_number
   self.number.gsub!(/\s+/, '')
 end
end
0 голосов
/ 05 сентября 2018

Вы pluck данные из таблицы пользователей. Таким образом, переменная phones содержит массив number, а не USER объекты. Вы не можете использовать save для элемента массива. Вот почему возникает ошибка. Вы можете сделать следующее:

space = " "
phones = User.where("number like ?", "%#{space}%")
phones.each do |phone|
  phone.number = phone.number.gsub(/\s+/, "")
  phone.save
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...