2010-06-01 2 views
0

J'ai un peu de code qui décrit cette configuration hypothétique ci-dessous. Une classe Foo qui contient beaucoup de barres. Bar appartient à un et un seul Foo. À un certain point, Foo peut faire une boucle finie qui perd 2+ itérations. Dans cette boucle, quelque chose comme ce qui suit se produit:Ruby on Rails: met temporairement à jour un attribut dans le cache sans l'enregistrer?

bar = Bar.find_where_in_use_is_zero 
bar.in_use = 1 

Fondamentalement, ce find_where_in_use_is_zero fait quelque chose comme cela dans la mesure où SQL va:

SELECT * from bars WHERE in_use = 0

Maintenant, le problème que je suis face est que je ne peut pas exécuter la ligne de code suivante après bar.in_use = 1 est invoquée:

bar.save 

la raison est claire, je suis toujours mise en boucle et le nouveau Foo n'a pas été créé, donc nous n'avons pas de foo_id à mettre dans bars.foo_id. Même si je définis pour autoriser foo_id à être NULL, nous avons un problème où l'une des barres peut échouer la validation et l'existant a été enregistré dans la base de données. Dans ma demande, cela ne fonctionne pas. La requête entière est atomique, tout réussit ou échoue ensemble. Ce qui se passe ensuite, c'est que dans ma boucle, j'ai le potentiel de sélectionner la même barre que celle que j'ai faite lors d'une précédente itération de la boucle puisque le drapeau in_use ne sera pas mis à 1 jusqu'à ce que @ foo.save soit appelé.

Est-il possible de contourner cette condition et de définir temporairement l'attribut in_use sur 1 pour les itérations suivantes de la boucle afin de récupérer une instance de barre disponible?

Répondre

-1

Vous pouvez enregistrer le bar avec une valeur nulle pour foo_id

Ou, pouvez-vous garder un hachage avec l'identifiant de la barre et la valeur de IN_USE qui est valide? Ensuite, vous vérifiez d'abord la valeur du hachage, puis celle de votre objet barre.

Si vous ne pouvez pas enregistrer l'état sur la base de données, vous devez le faire en dehors de la base de données. Personne ne peut vous dire comment faire exactement cela sans connaître les détails de votre projet.