(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]
-~----------~----~----~----~------~----~------~--~---

Répondre à