代码之家  ›  专栏  ›  技术社区  ›  Tom Bom

如何更新rails数据库记录

  •  -1
  • Tom Bom  · 技术社区  · 6 年前

    我有一个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 回复  |  直到 6 年前
        1
  •  1
  •   kiddorails    6 年前

    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
    
        2
  •  0
  •   Emu    6 年前

    你呢 pluck 来自用户表的数据。因此, phones 变量包含 number 用户 save 您可以执行以下操作:

    space = " "
    phones = User.where("number like ?", "%#{space}%")
    phones.each do |phone|
      phone.number = phone.number.gsub(/\s+/, "")
      phone.save
    end
    
        3
  •  0
  •   Code father    6 年前

    您可以创建一个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