如何更新rails db记录

问题描述 投票:-1回答:3

我有一个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'我该如何正确地做到这一点?

ruby-on-rails
3个回答
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

0
投票

你来自用户表的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

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
© www.soinside.com 2019 - 2024. All rights reserved.