J'ai une application où je dois empêcher les utilisateurs de données d'édition alors qu'il est en cours d'édition par un autre utilisateur. J'essaie de penser à la meilleure façon de le faire et je voulais demander des idées. Jusqu'à présent, j'ai créé un modèle de paramètres qui stocke la configuration à l'échelle de l'application sur la base de données dans les paires clé/valeur. Donc, pour le verrou, j'ai une instance de paramètres appelée LOCKED_TABLE_UID, et elle stocke le user_id de l'utilisateur éditant la table ou null (nil) si la table est libre.rails - mettant en oeuvre une serrure simple pour empêcher de modifier les mêmes données en même temps que l'utilisateur
>> lock = Setting.find_by_key('LOCKED_TABLE_UID')
Ensuite, je mis en œuvre 2 méthodes dans mon contrôleur d'application pour acquérir et libérer le verrou:
# 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
Ce que je veux est de créer une sorte de code de bloc qui contient le mécanisme de verrouillage, quelque chose comme ceci:
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
Je vous en serais reconnaissant de l'aide à ce sujet - mais je suis aussi ouvert à d'autres suggestions sur la façon d'accomplir tout cela, ou certaines choses que je peux avoir oublié. Ce verrou ne doit pas être atomique, mais plutôt basique et le plus important - que cela fonctionne :) merci.
Ce sont bons, mais je cherchais quelque chose de plus simple qui fournira également des informations sur l'utilisateur qui détient actuellement le verrou. – sa125