在模型重新加载之前,UUID列值不可用

Dav*_*ite 7 postgresql ruby-on-rails ruby-on-rails-4

我有一个模型,其中:uuid列由以下迁移设置.

add_column :website, :uuid, :uuid, default: "uuid_generate_v4()"
Run Code Online (Sandbox Code Playgroud)

在重新加载新创建的网站之前,似乎不会生成UUID.

website = Website.create!(host: 'example.com')
website.uuid
# => nil
website.reload
# => "de76e1c0-ac4a-4da6-8baf-8b9f037d39b1"
Run Code Online (Sandbox Code Playgroud)

有没有办法让UUID无需重新加载?

ste*_*eve 11

我也偶然发现了这一点。在 Rails 中发现了这个已关闭的问题,维护者基本上说“这是有意的”(很好,谢谢)。

我最终使用了与底部附近描述的解决方法类似的方法,这是我的代码片段:

after_commit :reload_uuid, on: :create

def reload_uuid
  self[:uuid] = self.class.where(id: id).pluck(:uuid).first
end
Run Code Online (Sandbox Code Playgroud)

我不费心检查它是否有 uuid 属性,因为我只将其添加到带有 uuid 的类中,并且我使用它,after_commit因为如果其他回调导致保存失败,为什么还要费心获取 uuid 呢?


Kin*_*ina 2

我会说,“据我所知,没有”……所以。不。

避免这种情况的唯一方法不是通过将 UUID 生成委托给数据库uuid_generate_v4()并使用SecureRandom.uuid. 像这样的回调before_save就可以了。

我猜想这是 ActiveModel 的一个设计决定,出于性能原因,保存后不重新加载。我的意思是,如果您愿意,您可以这样做,但不要假设所有场景都是如此(从他们的 POV 来看)...因此 ActiveModel 只是返回它最后必须避免访问数据库的对象。