ruby-on-rails - 在 Rails 中验证跨两个表的唯一性时如何避免竞争条件

标签 ruby-on-rails validation

This question讨论了跨两个表验证唯一性,接受的答案提到“这种代码级别的唯一约束可能无法在并行请求之间的竞争条件下工作,除非可以在数据库级别以某种方式完成。”

也就是说,如果您有一个 User 和一个 Organization 并且要在两者之间验证唯一的 slug,您如何确保这一点在数据库级别,或者以其他方式避免出现竞争条件的可能性?

我唯一的想法是创建一个相关记录,如 Slugbelongs_to 这两个模型。您可以将这些模型的 createupdate 包装在您还创建关联记录的事务中。除了确保额外的唯一性约束并在违反时在数据库级别引发错误外,此记录不用于任何其他用途。

是否有更好的方法或我是否走在正确的道路上?

最佳答案

我会采用类似的方法,但会添加数据库约束以确保这些 slug 的“唯一性”。所以,总结一下:

  • 一个多态模型Slug:belongs_to :sluggable, polymorphic: true
  • 控制关联模型创建(或回滚)的事务
  • 数据库层的约束以确保唯一性:add_index :slugs, :slug, unique: true

关于ruby-on-rails - 在 Rails 中验证跨两个表的唯一性时如何避免竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34049308/

相关文章:

ruby-on-rails - 如何在erb中编写while循环

javascript - 页面中的 Rails 4.1 Sass::SyntaxError#home

ruby-on-rails - 使用 Mechanize 时如何调试 Net::HTTPInternalServerError 错误?

ruby-on-rails - ruby 1.9.1 在处理 rails 2.3.x 中的非 ASCII 字符时是否仍然存在问题?

json - boolean 值是有效的 JSON

validation - 手动 knockout 以重新评估依赖的 Observable

在 Lex 中检查有效的算术表达式(在 C 中)

ruby-on-rails - rails - 如何设置模型新记录的 id 值有很多/属于关系?

node.js - 如何使用express-validation和joi验证Express Nodejs字符串中的body参数是否可以转换为JSON

Javascript 字符串验证。如何在字符串中只写一次字符并且只在开头?