在我的应用程序中,我有用户将对患者记录资源执行CRUD操作。通常,在创建患者记录之后,用户只会阅读它。但是,在极少数情况下,两个(或更多)用户因任何原因决定编辑该共享资源,解决此问题的最佳方法是什么?
我一直在阅读有关乐观和悲观锁定的内容,但我还不清楚这是否仅适用于更新操作,还是每当有人试图读取资源时都会发生锁定?
我在想的是,如果在两个或多个用户在同一页面上时有一种方式可以看到,从而通知第二个用户来到另一个用户已经在使用此资源的编辑页面,并且因此,只需等待第一个用户完成再继续。
你会怎么做?谢谢!
答案 0 :(得分:0)
您可以使用acts_as_lockable_by宝石来做到这一点。
下面是您的问题示例:
class Patient < ApplicationRecord
acts_as_lockable_by :id, ttl: 30.seconds
end
然后您可以在控制器中执行此操作:
class PatientsController < ApplicationController
def edit
if patient.lock(current_user.id)
# It will be locked for 30 seconds for the current user
# You will need to renew the lock by calling /patients/:id/renew_lock
else
# Could not lock the patient record which means it is already locked by another user
end
end
def renew_lock
if patient.renew_lock(current_user.id)
# lock renewed return 200
else
# could not renew the lock, it might be already released
end
end
private
def patient
@patient ||= Patient.find(params[:id])
end
end