This question讨论了跨两个表验证唯一性,接受的答案提到“这种代码级别的唯一约束可能无法在并行请求之间的竞争条件下工作,除非可以在数据库级别以某种方式完成。”
也就是说,如果您有一个 User
和一个 Organization
并且要在两者之间验证唯一的 slug
,您如何确保这一点在数据库级别,或者以其他方式避免出现竞争条件的可能性?
我唯一的想法是创建一个相关记录,如 Slug
,belongs_to
这两个模型。您可以将这些模型的 create
和 update
包装在您还创建关联记录的事务中。除了确保额外的唯一性约束并在违反时在数据库级别引发错误外,此记录不用于任何其他用途。
是否有更好的方法或我是否走在正确的道路上?
最佳答案
我会采用类似的方法,但会添加数据库约束以确保这些 slug 的“唯一性”。所以,总结一下:
- 一个多态模型
Slug
:belongs_to :sluggable, polymorphic: true
- 控制关联模型创建(或回滚)的事务
- 数据库层的约束以确保唯一性:
add_index :slugs, :slug, unique: true
关于ruby-on-rails - 在 Rails 中验证跨两个表的唯一性时如何避免竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34049308/