object.count返回0.但是object.any?返回true.发生了什么?

ale*_*ara 9 ruby activerecord ruby-on-rails

@card.submissions 返回:

<ActiveRecord::Associations::CollectionProxy [#<Submission id: nil, user_id: nil, card_id: 7, created_at: nil, updated_at: nil, text: "">]>
Run Code Online (Sandbox Code Playgroud)

@card.submissions.any?回报true.

@card.submissions.count回报0.

我想要实现的是:

if @card.submissions.any?
  render @card.submissions
end
Run Code Online (Sandbox Code Playgroud)

Phi*_*rom 11

看起来Submission是一条新记录(因为id是nil).如果它是新的,它还没有进入数据库. count对数据库进行SQL调用以确定行数,因此正确返回零. any?因为集合中有一个对象,所以返回true.

如果您尝试@card.submissions.to_a.size(确保从数据库加载它们然后检查数组的大小)会发生什么.

  • `@card.submissions.size` 就足够了 - 关系没有定义 size 方法,因此它会将其委托给目标。顺便说一句 - 使用 `size` 而不是 `count` 是摆脱 N+1 问题的好方法。 (2认同)