1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

allメソッドって良くないの?って話

Last updated at Posted at 2021-03-25

こんにちは。たにーです。

今回は、チーム開発で少し議論した

「アクション内でのでのallは良くない?」についてです。

items_controller.rb
 @items_all = Item.all

#結論

結論から言うと、悪いことはないが
場面によっては使い方を考えなくてはいけないということです。

カリキュラムで作成したアプリでは、
レコード数がmax10個ぐらいで試していたこともあり、取り出すデータ量が少ないため問題なかった。

もし、その数が100個、1000個、1万個あった場合だと、
情報量が多すぎて、処理速度が遅くなり、ページのロードが遅いなどが起きるかもしれません。

なので、その処理速度をより早くする書き方をご紹介します。

#状況について

  • railsでwebアプリケーションを開発中。
  • 販売している商品数をviewに表示させたい。

    例:( 商品一覧(全:〇〇件) )
  • viewとcontrollerには下記のように書いていた。
index.html.erb
    <div class="col-sm-12 px-sm-0">
      <h2>商品一覧(<%= @items_all.count %>件)</h2>
    </div>
items_controller.erb

  class Public::ItemsController < ApplicationController
  def index
    @items_all = Item.all
  end

#実際にターミナルを見て確認します。

まずは、そのままでページを開いてみます。
そうすると、、、、、

(item.allの場合)
 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

見て欲しいところはここです。

(item.allの場合)
   (0.2ms)  SELECT COUNT(*) FROM "items"
  ↳ app/views/public/items/index.html.erb:4

(0.2ms)、と書いてあります。

この数値が低ければ低いほど応答速度が速い(タイムラグが少ない)と言われています。

もしかしたら、不要なデータを取得してきているから
0.2なのか?書き方でより少なくできるのでは?と気になったところでチームメンバーで解決策を探しました。

#実際に調べて試しました

###selectで試した

items_controller.erb
  def index
    @items_all = Item.select(:id)
  end
(Item.selectの場合)
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で試した

items_controller.erb
class Public::ItemsController < ApplicationController
  def index
    @items_all = Item.count
  end
(Item.count)
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

もし、違った方法、間違っているなどあれば教えていただけますと幸いです。

以上、たにーでした。

#参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?