2011-05-06 3 views
4

Je suis en TestUnit (avec machiniste) et d'obtenir ce résultat très étrange quand je lance le débogueur rubisQuand un tableau ruby ​​compte-t-il pas le nombre d'éléments dans un tableau?

(rdb:1) @document.document_items 
[] 
(rdb:1) @document.document_items.count 
2 
(rdb:1) @document.document_items.length 
0 
(rdb:1) @document.document_items.size 
0 
(rdb:1) @document.document_items.class 
Array 
(rdb:1) @document 
#<Document id: 1, title: "Recusandae quibusdam dicta deleniti et voluptate.", state: "published", site_id: nil, template_document_id: 2, most_important_message: "Quam totam corporis similique voluptatibus quaerat ...", delta: nil, approver_id: 1, author_id: 1, account_id: 1, updated_at: "2011-05-06 08:59:12", created_at: "2011-05-06 08:59:12"> 
(rdb:1) DocumentItem.find(:all) 
[#<DocumentItem id: 1, title: "Et voluptatem officia voluptatem omnis voluptas.", body: "Nobis iste nostrum beatae corrupti ea qui debitis. ...", position: nil, document_id: 1, created_at: "2011-05-06 08:59:12", updated_at: "2011-05-06 08:59:12", version: 1, is_heading: false, help_message: nil, optional: nil, template_question_id: nil>, #<DocumentItem id: 2, title: "Ipsum in odio laborum ut officia.", body: "Quas temporibus iusto quidem non repellat. Quia des...", position: nil, document_id: 1, created_at: "2011-05-06 08:59:12", updated_at: "2011-05-06 08:59:12", version: 1, is_heading: false, help_message: nil, optional: nil, template_question_id: nil>] 

Un extrait de mes modèles de documents/DocumentItem:

class Document < ActiveRecord::Base 
    ... 
    has_many :document_items 
    ... 
end 

class DocumentItem < ActiveRecord::Base 
    ... 
    belongs_to :document 
    ... 
end 

Pourquoi les document_items nombre de tableaux différent du nombre d'éléments dans le document_items? Est-ce une sorte de magie machiniste? (Peut être lié à: Ruby 1.92 in Rails 3: A Case where Array.length Does Not Equal Array.count?)

Mais la question qui se pose est: pourquoi document_items est-il vide? Les connexions sont correctement mis en place, car cela fonctionne:

(rdb:1) DocumentItem.first.document 
#<Document id: 1, title: "Recusandae quibusdam dicta deleniti et voluptate.", state: "published", site_id: nil, template_document_id: 2, most_important_message: "Quam totam corporis similique voluptatibus quaerat ...", delta: nil, approver_id: 1, author_id: 1, account_id: 1, updated_at: "2011-05-06 08:59:12", created_at: "2011-05-06 08:59:12"> 
+0

Quelle est la sortie de '@ document.document_items'? –

+0

C'est dans la première ligne, un tableau vide: [] – zlog

+1

Ah, désolé. Avez-vous une étendue par défaut sur votre modèle DocumentItem? –

Répondre

2

Cela peut se produire comme suit:

  1. objet @document a commencé avec 0 document_items.
  2. Deux objets DocumentItem ont été créés directement, c'est-à-dire, pas via l'association @document.document_items.

Si vous ne rechargez pas @document à ce stade, alors length retourne seulement la taille du tableau document_items mises en mémoire cache pour l'objet @document, qui est 0. Cependant, count va à la base de données, et retourne 2 comme attendu. Pour contourner le problème, vous devez appeler explicitement reload sur @document après avoir créé les nouveaux objets DocumentItem.

+0

Alors comment recharger @document dans un cas testunit? – zlog

+0

En fait, nvm, @ document.reload a fait l'affaire – zlog

+0

Merci Le problème était machiniste didn Chargez l'objet document lors de l'ajout d'éléments de document. – zlog

Questions connexes