我有一个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'
,我该如何正确执行此操作?
答案 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