3

我想要做的基本上是让用户获得对记录的锁定并将其保留一段特定的时间,以便他们可以对其进行更改,例如维基百科。因此,假设一篇维基百科文章给用户一个小时的时间来编辑它,然后其他用户可以编辑它。

我如何使用 Rails 3 实现这一目标?我已经阅读并发现悲观锁定是我应该使用的锁。鉴于此......我会在一个小时后使用什么样的机制来释放锁?

我的堆栈是 Rails 3、Heroku、PostgreSQL。

感谢您提供任何答案,如果可以的话,我很乐意看到代码,那将是非常棒的!

4

3 回答 3

0

这是一个创建锁但不删除它们的示例。

我把它留给你。

在此示例中,锁定确实会在一个小时后过期,但要完成应用程序,它们应该在成功更新帖子时自动删除。

工作示例

或阅读

相关提交

于 2011-10-13T06:07:36.323 回答
0

您可以使用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
于 2018-11-06T14:49:49.833 回答
-1

添加一个名为 "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
于 2011-10-13T08:43:00.440 回答