Это типичный шаблон рабочего процесса, где вы приобретаете объект на время. Этого легко добиться, внедрив блокировки на уровне приложений.
1) Добавление полей блокировки в модель.
locker_id
lock_until
2) Теперь вы можете реализовать эту логику в модели Product.
class Product
belongs_to :locker, :class_name => "User",
:condition => lambda { {:conditions => ["lock_until < ? ", Time.now]}}
def locked?
!lock_until.nil? and lock_until > Time.now
end
def lock_for_duration(usr, duration=10.minutes)
return false if locked?
self.locker_id = user.id
self.lock_until = duration.from_now
self.save
end
def release_lock
return true unless locked?
self.locker_id = nil
self.lock_until = nil
self.save
end
end
Вот как это использовать:
usr = User.first
product.lock_for_duration(usr, 30.minutes)
product.locked?
product.locker?