こんにちは。たにーです。
今回は、チーム開発で少し議論した
「アクション内でのでのallは良くない?」についてです。
@items_all = Item.all
#結論
結論から言うと、悪いことはないが
場面によっては使い方を考えなくてはいけないということです。
カリキュラムで作成したアプリでは、
レコード数がmax10個ぐらいで試していたこともあり、取り出すデータ量が少ないため問題なかった。
もし、その数が100個、1000個、1万個あった場合だと、
情報量が多すぎて、処理速度が遅くなり、ページのロードが遅いなどが起きるかもしれません。
なので、その処理速度をより早くする書き方をご紹介します。
#状況について
- railsでwebアプリケーションを開発中。
- 販売している商品数をviewに表示させたい。
例:( 商品一覧(全:〇〇件) ) - viewとcontrollerには下記のように書いていた。
<div class="col-sm-12 px-sm-0">
<h2>商品一覧(全<%= @items_all.count %>件)</h2>
</div>
class Public::ItemsController < ApplicationController
def index
@items_all = Item.all
end
#実際にターミナルを見て確認します。
まずは、そのままでページを開いてみます。
そうすると、、、、、
Started GET "/" for 106.180.147.162 at 2021-03-25 11:43:45 +0000
Cannot render console from 106.180.147.162! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Public::HomesController#top as HTML
Rendering public/items/index.html.erb within layouts/application
(0.2ms) SELECT COUNT(*) FROM "items"
↳ app/views/public/items/index.html.erb:4
見て欲しいところはここです。
(0.2ms) SELECT COUNT(*) FROM "items"
↳ app/views/public/items/index.html.erb:4
(0.2ms)、と書いてあります。
この数値が低ければ低いほど応答速度が速い(タイムラグが少ない)と言われています。
もしかしたら、不要なデータを取得してきているから
0.2なのか?書き方でより少なくできるのでは?と気になったところでチームメンバーで解決策を探しました。
#実際に調べて試しました
###selectで試した
def index
@items_all = Item.select(:id)
end
Started GET "/items" for 106.180.147.162 at 2021-03-25 12:13:24 +0000
Cannot render console from 106.180.147.162! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Public::ItemsController#index as HTML
Rendering public/items/index.html.erb within layouts/application
(0.1ms) SELECT COUNT("items"."id") FROM "items"
↳ app/views/public/items/index.html.erb:4
それでも0.2msで早くなっているのがわかります。
###countで試した
class Public::ItemsController < ApplicationController
def index
@items_all = Item.count
end
Started GET "/items" for 106.180.147.162 at 2021-03-25 12:22:09 +0000
Cannot render console from 106.180.147.162! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by Public::ItemsController#index as HTML
(0.1ms) SELECT COUNT(*) FROM "items"
こちらも、0.1msと早くなってるのかな?
#結果としては、
メソッド | 応答速度 |
---|---|
all | 0.2ms |
select | 0.1ms |
count | 0.1ms |
もし、違った方法、間違っているなどあれば教えていただけますと幸いです。
以上、たにーでした。
#参考文献