了解rails大小与计数,以及为什么.size在视图中不起作用?

时间:2017-09-26 15:25:04

标签: ruby-on-rails ruby ruby-on-rails-3

当我使用方法.count时,它工作正常,并准确显示帖子的数量。当我尝试.size时,它会抛出一个错误。这是为什么?

我的static_controller.rb代码( COUNT 作为方法)

class StaticController < ApplicationController

def index
@post_count = Post.count
@user_count = User.count
end

index.html.erb( COUNT 作为方法)

<div>
      <p> <%= @post_count %> </p>
</div>

当我将.count的实例更改为size时,我在本地服务器中收到此错误:

/的NoMethodError 未定义的方法`大小&#39;对于#

index - app / controllers / static_controller.rb,第4行

这是为什么? .size不是rails的内置方法吗?如果没有,我该如何解决这个问题?

另外,我是否理解如果将counter_cache应用于应用该方法的模型,则.size更高效?例如,如果我的post.rb模型有一个声明counter_cache的部分,那么它会自动使它更快/更高效吗?

2 个答案:

答案 0 :(得分:2)

count是一个AR方法,它将在SQL查询中使用COUNT,它实际上使AR意识到您正在进行数据库查询,并返回数据库返回的计数值。

大小是集合的方法,Post和User是类,而不是集合,因此从不使用AR,并且最终会出现错误,因为您首先需要进行AR查询才能拥有集合,甚至是空的之一。

执行您尝试的操作的方法是使用all,这将返回一个集合。

@post_count = Post.all.size
@user_count = User.all.size

答案 1 :(得分:2)

有3种类似的方法:

  • count正在使用SQL查询。这是最快的方式,但正如您所注意到的那样,并不总是可以执行。

  • 如果已加载集合,
  • length将返回集合的长度而不执行其他查询。它可能无效,因为它会将整个集合加载到内存中。

  • size这是countlength的组合。仅在卸载集合时才执行其他查询。