我有一个模型,其中:uuid
列由以下迁移设置。
add_column :website, :uuid, :uuid, default: "uuid_generate_v4()"
在我重新加载新创建的网站之前,似乎没有生成UUID。
website = Website.create!(host: 'example.com')
website.uuid
# => nil
website.reload
# => "de76e1c0-ac4a-4da6-8baf-8b9f037d39b1"
有没有办法让UUID无需重新加载?
答案 0 :(得分:2)
我说,“我不知道' ......所以。否。
唯一可以避免这种情况的方法是不通过uuid_generate_v4()
将UUID生成委托给DB,并使用SecureRandom.uuid
之类的东西在Ruby / Rails端生成它。像before_save
这样的回调就可以了。
我想这是一个关于ActiveModel的设计决定,在出于性能原因保存后不再重新加载。我的意思是,如果你愿意,你可以这样做,但不要认为所有场景(来自他们的POV)的情况都是如此......所以ActiveModel只返回它最后必须避免跳转到数据库的对象
答案 1 :(得分:0)
我也偶然发现了这一点。在Rails中发现这个closed issue时,维护人员基本上会说“这是故意的”(非常感谢)。
我最终使用了类似于底部附近所述的解决方法,这是我的摘录:
after_commit :reload_uuid, on: :create
def reload_uuid
self[:uuid] = self.class.where(id: id).pluck(:uuid).first
end
我不用费心检查它是否具有uuid属性,因为我只将此属性添加到带有uuid的类中,而我使用after_commit
是因为如果其他回调导致保存失败,为什么还要费心获取uuid? / p>