3

私がやりたいのは、基本的に、ユーザーがレコードのロックを取得し、ウィキペディアのようにレコードに変更を加えることができるように、特定の時間ロックを取得することです。つまり、ウィキペディアの記事では、他のユーザーが編集する前に、ユーザーが編集するのに1時間かかるとします。

Rails 3でそれをどのように達成できますか?読んだところ、悲観的なロックがロックに使用する必要があることがわかりました。それを考えると...1時間後にロックを解除するためにどのようなメカニズムを使用しますか?

私のスタックはRails3、Heroku、PostgreSQLです。

回答ありがとうございます。できればコードを見るのが大好きです。

4

3 に答える 3

0

これは、ロックを作成するが、それらを削除しない例です。

それはあなたに任せます。

この例では、ロックは1時間後に期限切れになりますが、アプリを完了するには、投稿が正常に更新されたときにロックが自動的に削除される必要があります。

実例

または

関連するコミット

于 2011-10-13T06:07:36.323 に答える
0

これは、 acts_as_lockable_bygemを使用して行うことができます。

1人のユーザーのみが編集できる患者(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 に答える