亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ActiveRecord:大小與計數

ActiveRecord:大小與計數

鳳凰求蠱 2019-09-19 09:09:57
在Rails中,您可以找到使用Model.size和的記錄數Model.count。如果您正在處理更復雜的查詢,那么使用一種方法優于另一種方法是否有任何優勢?他們有什么不同?例如,我有用戶的照片。如果我想顯示一個用戶表和他們有多少張照片,那么運行的實例user.photos.size會更快還是更慢user.photos.count?謝謝!
查看完整描述

3 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

你應該讀到,它仍然有效。

您將根據需要調整您使用的功能。

基本上:

  • 如果您已經加載了所有條目,User.all那么您應該使用length以避免另一個數據庫查詢

  • 如果您沒有加載任何內容,請使用count對數據庫進行計數查詢

  • 如果您不想打擾這些考慮因素,請使用size適合的考慮因素


查看完整回答
反對 回復 2019-09-19
?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

正如其他答案所述:

  • count將執行SQL COUNT查詢

  • length 將計算結果數組的長度

  • size 將嘗試選擇最合適的兩個,以避免過多的查詢

但還有一件事。我們注意到一個size行為不同countlength完全不同的情況,我想我會分享它,因為它很少被忽視。

  • 如果您:counter_cachehas_many關聯上使用a ,size將直接使用緩存計數,而不是進行額外查詢。

    class Image < ActiveRecord::Base
      belongs_to :product, counter_cache: trueendclass Product < ActiveRecord::Base
      has_many :imagesend> product = Product.first  # query, load product into memory> product.images.size      # no query, reads the :images_count column> product.images.count     # query, SQL COUNT> product.images.length    # query, loads images into memory

Rails指南中記錄了這種行為,但我要么第一次錯過它,要么忘了它。


查看完整回答
反對 回復 2019-09-19
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

以下策略都調用數據庫來執行COUNT(*)查詢。

Model.countModel.all.size

records = Model.all
records.count

以下內容不如將數據庫中的所有記錄加載到Ruby中那樣高效,后者會計算集合的大小。

records = Model.all
records.size

如果模型具有關聯并且您想要查找所屬對象的數量(例如@customer.orders.size),則可以避免數據庫查詢(磁盤讀?。?。使用計數器緩存,Rails將使緩存值保持最新,并返回該值以響應該size方法。


查看完整回答
反對 回復 2019-09-19
  • 3 回答
  • 0 關注
  • 714 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號