在数据迁移中覆盖attr_readonly以在现有记录上填充新的只读字段

时间:2016-04-15 10:52:41

标签: ruby-on-rails ruby activerecord

我在现有模型中添加了一个UUID字段。我希望它只读,所以不能改变。

型号:

class Token < ActiveRecord::Base
  attr_readonly :uuid
  before_create :set_uuid, on: create

  def set_uuid
    self.uuid = SecureRandom.urlsafe_base64(8)
  end
end

但是我想用UUID填充现有记录。我无法通过默认值执行此操作,因为它们不是动态生成的。

我可以在模型中编写一个自定义验证器,但是当我真的想要在数据迁移中覆盖attr_readonly时,这似乎有些过分。

目前我的数据迁移不会从nil更改现有值的值。

数据迁移:

class AddUuidToTokens < ActiveRecord::Migration
  def self.up
    Token.all.each do |token|
    if token.uuid.nil?
      token.uuid = SecureRandom.urlsafe_base64(8)
      token.save!
    end
  end
end

1 个答案:

答案 0 :(得分:3)

You could just override the Token class itself in the migration:

class AddUuidToTokens < ActiveRecord::Migration
  class Token < ActiveRecord::Base
  end

  def self.up
    Token.where(uuid: nil).find_each do |token|
      token.update_columns(uuid: SecureRandom.urlsafe_base64(8))
    end
  end
end

Minor improvement: Load only records without an uuid instead of checking all records against nil?.