У меня есть приложение, в котором мне нужно запретить пользователям редактировать данные, пока они редактируются другим пользователем. Я пытаюсь придумать лучший способ сделать это и хотел спросить идеи. До сих пор я создал модель настроек, в которой конфигурация всего приложения хранится в БД в парах ключ / значение. Итак, для блокировки у меня есть экземпляр настроек, который называется LOCKED_TABLE_UID, и он хранит user_id пользователя, редактирующего таблицу, или ноль (nil), если таблица свободна.
>> lock = Setting.find_by_key('LOCKED_TABLE_UID')
Затем я реализовал 2 метода в своем контроллере приложений для получения и снятия блокировки:
# current_user returns the user currently logged in
def acquire_lock
lock = Setting.find_by_key("LOCKED_TABLE_UID")
if lock.value
# if lock taken, see if it's the current_user or someone else
if lock.value.to_i == current_user.id.to_i
return true
else
return false
end
else
# lock is free, assign it to this user
lock.value = current_user.id
return true if lock.save
end
end
def release_lock
lock = Setting.find_by_key("LOCKED_TABLE_UID")
if lock.value
# the lock belongs to current_user, so he can release it
if lock.value.to_i == current_user.id.to_i
lock.value = nil
return true if lock.save
else
# not your lock, go away
return false
end
else
# lock is free, quit bugging
return true
end
end
То, что я хочу, - это создать некоторый блочный код, который содержит механизм блокировки, что-то вроде этого:
def some_crud_action
requires_locking do |lock|
if lock
# do some CRUD stuff here
else
# decline CRUD and give some error
end
end
end
Буду признателен за помощь в этом вопросе, но я также открыт для других предложений о том, как добиться всего этого, или некоторых вещей, которые я мог упустить из виду. Эта блокировка не должна быть атомарной, но достаточно простой и самой важной - чтобы она работала :)
спасибо.