Когда число в массиве ruby ​​не будет равно количеству элементов в массиве? - PullRequest
4 голосов
/ 06 мая 2011

Я использую testunit (с машинистом) и получаю очень странный результат при запуске отладчика ruby ​​

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

Фрагмент моей модели Document / DocumentItem:

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

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

Почему число в массиве document_items отличается от количества элементов в document_items? Это какая-то магия машиниста? (может быть связано с: Ruby 1.92 в Rails 3: случай, когда Array.length не равна Array.count? )

Но вопрос, который связан со всем этим, заключается в том, почему document_items пуст? Соединения настроены правильно, так как это работает:

(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">

1 Ответ

2 голосов
/ 09 мая 2011

Это может произойти следующим образом:

  1. @document объект начинался с 0 document_items.
  2. Два DocumentItem объекта были созданы напрямую, то есть не через @document.document_items ассоциацию.

Если вы не перезагрузите @document на этом этапе, то length возвращает только размер массива document_items, кэшированного в памяти для объекта @document, который равен 0. Однако count отправляется в базу данных и возвращает 2, как и ожидалось.

Чтобы обойти это, вам нужно явно вызвать reload на @document после создания новых DocumentItem объектов.

...