我在现有模型中添加了一个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
答案 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?
.