当我使用方法.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的部分,那么它会自动使它更快/更高效吗?
答案 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
这是count
和length
的组合。仅在卸载集合时才执行其他查询。