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

时间:2015-12-02 17:35:46

标签: ruby-on-rails validation

This question讨论了验证两个表的唯一性,并且接受的答案提到“这样的代码级别唯一约束在并行请求中的竞争条件下可能不起作用,除非这可以在数据库级别完成。”

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

我唯一的想法是创建一个像Slug这样的相关记录,belongs_to两个模型。您可以将这些模型的createupdate包装在您也创建关联记录的事务中。除非确保存在额外的唯一性约束,否则此记录不会用于任何事情,如果违反了该错误,则会在数据库级别引发错误。

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

1 个答案:

答案 0 :(得分:2)

我会使用类似的东西,但添加数据库约束以确保这些slu的“唯一性”。所以,总结一下:

  • 多态模型print()Slug
  • 用于控制关联模型的创建(或回滚)的事务
  • DB层的约束以确保唯一性:belongs_to :sluggable, polymorphic: true