2012-03-23 4 views
0

Je rencontre un problème étrange depuis que j'ai mis à niveau vers Rails 3.2.Objets imbriqués et taille de la collection

Mon application a des objets gérés avec des formes imbriquées, mais lorsque j'essaie d'atteindre la taille d'une collection après avoir construit un nouvel objet imbriqué, l'objet imbriqué est pris en compte.

Ex .:

1.9.3p0 :004 > e = Expense.last 
    Expense Load (22.6ms) (...) 
=> #<Expense id: 1, (...) 
1.9.3p0 :005 > e.comments.size 
    (0.3ms) SELECT COUNT(*) (...) 
=> 0 
1.9.3p0 :006 > e.comments.build 
=> #<Comment id: nil, content: nil, commentable_id: 1, commentable_type: "Expense", created_at: nil, updated_at: nil, creator_id: nil> 
1.9.3p0 :007 > e.comments.size 
=> 1 

Dans ce cas, je me attends à la e.expense.size pour revenir 0 puisque l'objet Comment n'a pas encore été enregistré.

Répondre

0

Construire le commentaire crée ... 1 commentaire. Il n'existe pas (encore) dans la base de données, donc e.commment.count retournera 0, mais il existe dans l'application, donc size renvoie 1. Donc ce genre de logique.

Mais je vois qu'il y a un petit résultat potentiellement inattendu ici. Si un commentaire n'existe pas en mémoire, il ressemble à Rails vérifie avec le DB (le SELECT COUNT(*)...), alors que s'il en trouve un en mémoire, il ne le fait pas.

Je me demande ce qui se passerait si vous aviez déjà plusieurs commentaires existants, puis vérifié e.comments.size dans ce cas?

Quelle est la version de Rails qui a fonctionné différemment?

+0

Peut-être que ce n'est pas depuis la mise à niveau, peut-être que je ne l'ai pas remarqué auparavant. Le fait est que je reçois ce comportement quand j'appelle 'pour commenter dans e.comments', et puisque le commentaire qui vient d'être construit n'est pas encore sauvegardé, cela soulève aussi une erreur – AkyRhO