2017-07-13 63 views
0

我使用交易来保存Hotel模型。这里是一个代码:与交易的唯一性验证

def init 
    Hotel.transaction do 
    @hotel.save! 
    create_related_models 
    end 
end 

我在酒店有:name唯一性验证。验证在事务内不起作用。在交易中实施与数据库相关的验证的方式是什么?

解释为什么验证不起作用。

当用户提交表单时,请求大约需要10秒钟。如果他在请求期间点击另一个时间(在保存按钮上),则他将保存两个同名的酒店(这是问题)。这是因为第一笔交易未完成,另一笔交易开始时。因此,当另一开始出现在数据库中没有酒店,以便确认返回真

回答

1

你将需要:

  1. 添加数据库约束,以防止这种行为,并捕获并处理任何错误。应用程序无法看到未提交的RDBMS事务。只有数据库可以做到这一点。
  2. 在应用程序中添加锁定机制,如果您在多个线程(Heroku dynos?)上运行,这将会很困难。
  3. 大大减少交易所需的时间。
  4. 在交易之外移动相关模型的创建,并提供手动删除酒店记录的机制,这是执行期间出现的问题。
  5. 删除唯一性验证。
+0

我想添加锁定机制,但结果太困难了。感谢所有解决方案。目前我添加了javascript按钮块,但我也会实现你的第一个解决方案(约束和处理错误) –