(bon je m'apercois en me relistant que j'ai oublié des indentations et des 'end' mais le principe reste valable)
Michel Belleville 2009/2/4 Michel Belleville <[email protected]> > Sinon, tu peux faire une méthode qui décore create en mettant une > transaction autour, du genre : > > class Mission < AR::B > ... > def create_according_to_stock(*args, &block) > self.transaction do > self.create(args, block) > end > ... > end > > Et dans ton contrôleur, tu appelles ta méthode décorante à la place du > create normal. > > Michel Belleville > > > 2009/2/4 Fabien Jakimowicz <[email protected]> > > >> 2009/2/4 Guillaume Betous <[email protected]>: >> > Bonjour, j'ai 2 modèles qui, au niveau métier sont liés de la manière >> > suivante : >> > >> > - Une classe AR "production" contient entre autre une info de stock >> (dans le >> > sens quantité) >> > - Une classe AR "mission" puise dans ce stock pour apporter (camion) de >> la >> > marchandise vers une autre ville >> > - Une mission n'est possible que si le stock correspondant est >> strictement >> > positif. >> > >> > Jusqu'à présent tout se passe dans la classe "mission" : >> > - un "validate_on_create" s'assure que le stock est suffisant >> > - un "after_create" décrémente le stock de la valeur correspondant à la >> > mission >> > >> > Mon soucis est de rendre ça atomique : lors d'un accès concurrent au >> meme >> > stock, je ne veux pas que 2 personnes pensent qu'il y a du stock, que >> les 2 >> > décrémentes, et que finalement le stock devienne négatif vu qu'en fait >> il >> > n'y en avait pas pour les 2. >> > >> > J'ai bien vu les transactions[1], mais je ne sais pas comment faire pour >> la >> > mettre dans le modèle, vu que ça touche des actions avant et après la >> > création. >> > >> >> Je pense que pour être vraiment sur du résultat, tu devrais utiliser >> des contraintes sur ta base de données directement. >> >> -- >> http://fabien.jakimowicz.com >> >> >> >> > --~--~---------~--~----~------------~-------~--~----~ Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement envoyez un e-mail à l'adresse [email protected] -~----------~----~----~----~------~----~------~--~---
