2015-07-02 2 views
7

@card.submissions возвращает это:object.count возвращает 0. Но object.any? возвращает true. Что происходит?

<ActiveRecord::Associations::CollectionProxy [#<Submission id: nil, user_id: nil, card_id: 7, created_at: nil, updated_at: nil, text: "">]> 

@card.submissions.any? возвращает true.

@card.submissions.count0.

Что я ищу осуществить это:

if @card.submissions.any? 
    render @card.submissions 
end 

ответ

9

Похоже Подчинение новый рекорд (поскольку идентификатор равен нулю). Если он новый, он еще не попал в базу данных. count выполняет вызов SQL в базу данных, чтобы определить количество строк, поэтому верно возвращает нуль. any? возвращает true, поскольку в коллекции есть объект.

Что произойдет, если вы попробуете @card.submissions.to_a.size (чтобы обеспечить их загрузку из базы данных, проверьте размер массива).

+0

Правильно, сегодня я кое-что узнал. Для справки, вот метод ['count'] (http://edgeapi.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html#method-i-count) и [' any? '] (Http: //edgeapi.rubyonrails.org/classes/ActiveRecord/Associations/CollectionProxy.html#method-i-any-3F). – sjagr

+0

Филлип, ты прав. Это возвращает 1. У меня есть форма для представления (и я инициализирую его с Submission.new) на той же странице. Как я могу решить это? (без использования @ card.submission.count ..., который я вижу как неэлегантный) – alejoriveralara

+1

'@ card.submissions.size' будет достаточно - отношение не определяет метод размера, поэтому он делегирует его цели. BTW - использование 'size' вместо' count' - хороший способ избавиться от проблемы N + 1. – BroiSatse

0

Старый вопрос, но, тем не менее, я хочу почистить. Я наткнулся на аналогичный вопрос, и нашел:

@card.submissions.any? = true 
@card.submissions.count = 0 

несмотря на то, что не было никаких записей в моей базе данных, но я инициализируется пустой @card.submission объект, который был в @card.submissions массиве.

Чтобы смягчить эту проблему, я попытался

@card.submissions.all.any? 

который перезарядил массив из базы данных, и возвращенное false.

Смежные вопросы