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 呢?
我会说,“据我所知,没有”……所以。不。
避免这种情况的唯一方法不是通过将 UUID 生成委托给数据库uuid_generate_v4()并使用SecureRandom.uuid. 像这样的回调before_save就可以了。
我猜想这是 ActiveModel 的一个设计决定,出于性能原因,保存后不重新加载。我的意思是,如果您愿意,您可以这样做,但不要假设所有场景都是如此(从他们的 POV 来看)...因此 ActiveModel 只是返回它最后必须避免访问数据库的对象。
| 归档时间: |
|
| 查看次数: |
704 次 |
| 最近记录: |