如何更新Rails数据库记录

时间:2018-09-05 06:51:32

标签: ruby-on-rails

我有一个Rails应用程序。我有一个表用户和一列数字,它是一个字符串。一些用户使用空格保存了他们的电话号码(例如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 :(得分:1)

您需要具有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

答案 1 :(得分:0)

pluck来自用户表中的数据。因此,phones变量包含一个{<1> USER 对象的number数组。您不能在数组元素上使用save。这就是为什么会发生错误。 您可以执行以下操作:

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

答案 2 :(得分:0)

您可以采取的方法是创建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

然后执行rake任务。

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