我想要做的基本上是让用户获得对记录的锁定并将其保留一段特定的时间,以便他们可以对其进行更改,例如维基百科。因此,假设一篇维基百科文章给用户一个小时的时间来编辑它,然后其他用户可以编辑它。
我如何使用 Rails 3 实现这一目标?我已经阅读并发现悲观锁定是我应该使用的锁。鉴于此......我会在一个小时后使用什么样的机制来释放锁?
我的堆栈是 Rails 3、Heroku、PostgreSQL。
感谢您提供任何答案,如果可以的话,我很乐意看到代码,那将是非常棒的!
我想要做的基本上是让用户获得对记录的锁定并将其保留一段特定的时间,以便他们可以对其进行更改,例如维基百科。因此,假设一篇维基百科文章给用户一个小时的时间来编辑它,然后其他用户可以编辑它。
我如何使用 Rails 3 实现这一目标?我已经阅读并发现悲观锁定是我应该使用的锁。鉴于此......我会在一个小时后使用什么样的机制来释放锁?
我的堆栈是 Rails 3、Heroku、PostgreSQL。
感谢您提供任何答案,如果可以的话,我很乐意看到代码,那将是非常棒的!
您可以使用acts_as_lockable_by gem 来做到这一点。
想象一下,您有一个只能由一个用户编辑的患者(ActiveRecord)类,并且在他决定释放它之前,它应该被锁定给这个用户:
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
添加一个名为 "editable_until":datetime 的字段,并在创建记录时设置特定日期(Time.now + 30.min fe)。只需查询该字段即可了解用户是否有权更新记录。
class Post << AR
before_validation :set_editable_time
validate :is_editable
def editable?
self.editable_until.nil? || self.editable_until >= Time.now
end
protected
def is_editable
self.errors[:editable_until] << "cannot be edited anymore" unless editable?
end
def set_editable_time
self.editable_until ||= Time.now + 30.min
end
end
Post.create(:params....)
=> <Post, ID:1, :editable_until => "2011-10-13 15:00:00">
Post.first.editable?
=> true
sleep 1.hour
Post.first.editable?
=> false