ruby-on-rails-3rails-postgresqlpessimistic-locking

How do I lock records in Rails 3 for a specific amount of time?


What I want to do is basically have a user obtain the lock on a record and have it for a specific amount of time so they can make changes to it, like wikipedia. So lets say a wikipedia article gives the user an hour to edit it before other users may edit it.

How could I achieve that with Rails 3? I have read up and found that pessimistic locking is what I should use for the lock. Given that... What kind of mechanism would I use for releasing the lock say after an hour?

My stack is Rails 3, Heroku, PostgreSQL.

Thanks for any answers and I love to see code if you can that would be so awesome!


Solution

  • Add a field called "editable_until":datetime and set a specific date (Time.now + 30.min f.e.) when creating your record. And simply query this field to find out if the user has the right to update the record or not.

    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