2017-09-26 47 views
2

當我使用方法.count時,它工作得很好,準確地顯示帖子的數量。當我嘗試.size時,它會引發錯誤。爲什麼是這樣?瞭解導軌大小vs計數,以及爲什麼.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在爲#

索引/ 未定義的方法`大小」 - 應用程序/控制器/ static_controller.rb,第4行

這是爲什麼? .size不是內置的rails方法嗎?如果不是,我該如何解決這個問題?

另外,我的理解是否正確:如果將counter_cache應用於該方法正在應用的模型,那麼.size的性能會更高。例如,如果我的post.rb模型有一個聲明counter_cache的部分,這是否會自動使它更快/更高效?

+0

在Rails 4中,您可以使用:'Post.count'或'Post.all.size' –

回答

2

count是一個AR方法,它將在SQL查詢中使用COUNT,它實際上使AR知道您正在執行數據庫查詢,並且它返回數據庫返回的計數值。

Size是一個集合的方法,Post和User是類而不是集合,所以AR從不使用,並且最終會出現錯誤,因爲您首先需要執行AR查詢以獲取集合,即使是空一個。

軌道的方式做你所嘗試的是使用all,這將返回一個集合。

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

感謝您的解釋。 AR是什麼意思? ActiveRecord的? 而且表現是否正確?或者它可以忽略不計? – mazing

+3

是的,AR代表ActiveRecord。關於性能,我認爲計數器緩存與通過關係計數有關。你可能在做過早的優化。只要專注於使應用程序變得整潔有序,速度優化就可以在以後進行。 – Syl

1

有3種類似的方法:

  • count這是使用SQL查詢。這是最快的方式,但正如您已經注意到的,並不總是可以執行。

  • length將返回集合的長度而不執行額外的查詢,如果集合已經加載。這可能是無效的,因爲它會將整個集合加載到內存中。

  • size這是countlength的組合。只有在卸載收集時纔會執行附加查詢。

相關問題