2010-02-03 4 views
1

Comment gérer les conflits de versions lorsque plusieurs éditeurs simultanés sont sur le même modèle? par exemple utilisateur A cliquez sur modifier sur le contrôleur de poste et commencer à modifier le contenu utilisateur B cliquez sur modifier sur le contrôleur de poste et commencer à modifier le titre l'utilisateur B est fait et cliquez sur Enregistrer l'utilisateur A est fait et cliquez sur Enregistrer et remplacer le modifications effectuées par l'utilisateur BGestion des conflits de version lorsque plusieurs éditeurs simultanés sur le même modèle suivent les mêmes règles

est là pour éviter cela? Je pense utiliser le champ updated_at pour vérifier que la version éditée est la dernière. un plugin ou une gemme pour le faire ??

+0

Je pense que la soumission de la valeur updated_at et sa comparaison avant la mise à jour du modèle est un bon compromis par rapport à l'ajout d'une gemme. Si différent; montrez les différences pour que votre utilisateur fusionne manuellement. – gamov

Répondre

1

Ce que vous cherchez est un contrôle de révision ou un système de contrôle de version pour ActiveRecord. The Ruby Toolbox indexes several of them. vestal_versions de laserlemon ressemble à ce qu'il ferait le travail. Je ne suis pas sûr qu'il gère les conflits de version dès la sortie de la boîte, mais peut être fait avec une fourchette et quelques modifications.

+0

Le lien mis à jour vers The Ruby Toolbox est https://www.ruby-toolbox.com/categories/Active_Record_Versioning – RocketR

+0

Merci, j'ai mis à jour la réponse. –

1

Je ne connais pas de plugins ou de gemmes qui s'occupent de cela directement (ie en manipulant tout du modèle aux vues), et ont cherché brièvement sur gemcutter.org et agilewebdevelopment.com pour les plugins en vain .

Google Wave est l'un des programmes les plus prometteurs qui gère très bien ce problème.

Mais si ce n'est pas une option (comme presque ne sera certainement pas), voici une idée rapide et très simple qui pourrait vous arriver:

  1. Ajouter un champ à la vue « modifier » appelé "requested_at"

  2. Lorsque vous recevez la 'mise à jour' pour une modification, vérifiez si la valeur du champ de formulaire "requested_at" est inférieure à la valeur "updated_at" de l'objet stocké.

  3. Si tel est le cas, envoyez une réponse au navigateur avertissant l'utilisateur du conflit possible. Vous pouvez même afficher une différence entre les données soumises par l'utilisateur et l'état actuel de l'objet stocké. Pour cet affichage « diff » Je recommande la bibliothèque diff-lcs disponible à Gemcutter: http://gemcutter.org/gems/diff-lcs

  4. Après les vues utilisateur et révise son subimssion, rincer et répéter (ou leur donner la possibilité de passer outre les modifications existantes, même si quelqu'un d'autre a édité le texte).

Une réponse mentionné ci-dessous l'utilisation de versionnage pour vos modèles active_record, et que vous pourriez essayer ActsAsAudited (au moins c'est mon préféré) ... mais je ne suis pas sûr que c'est le problème que vous décriviez.

+1

Exactement ce que j'allais dire. Vous pouvez également faire quelque chose comme StackOverFlow - ajouter du javascript sur le côté client pour interroger les mises à jour et avertir l'utilisateur si le message a été modifié. – klochner

+0

Tout de suite .... en utilisant JS pour interroger les mises à jour est une excellente idée. – btelles