我有一个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'
我该如何正确地做到这一点?
你需要有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
你来自用户表的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
您可以这样做是创建一个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