【初心者用】Ruby on Railsの勉強【アソシエーションとN+1問題】

今回はRailsにおける非常に重要な概念であるアソシエーションN+1問題について解説していこうと思います。

 

本記事の内容は

  • アソシエーションとは
  • アソシエーションの定義の仕方
  • N+1問題とは
  • N+1問題の解消方法

 

それでは早速見ていきましょう。

 

アソシエーションとは

アソシエーションとはモデルを利用してテーブル同士を関連づけることのことを言います。どんな時に役立つかというとユーザーや投稿数が多くなってくると複数のモデルから情報を取得しなくてはなりません。複数モデルからの情報取得は記述がとても長くなり大変です。

 

アソシエーションをモデルに定義しておけば、そのモデルに関連づけされたユーザーと投稿情報をいつでも取得することが可能になります。簡単にいうと1人のユーザーがたくさんの投稿をしたとしても投稿を見れば誰が投稿したかわかるし、ユーザーを見ればどの投稿をしたかがわかるというものです。

 

 

アソシエーションの定義の仕方

✔︎has_manyメソッド

1人のユーザーが複数の投稿を行なっている場合の関係性をhas_manyと言います。このように1対多数の関係性を関連づけるのがhas_manyメソッドの役割です。

1
2
3
4
5
class モデル名 < ApplicationRecord
  devise :~~~~~~
         :~~~~~~
  has_many :モデル名
end

上記のように1つのモデルのクラスに「has_many :モデル名」と定義することで関連づけることができます。

 

✔︎belongs_toメソッド

1つのユーザーが投稿したものはどれだけたくさんの投稿をしても1つずつ1対1の関係でもあります。その関係性をbelongs toと言います。このように1対1の関係性を定義するメソッドがbelongs_toメソッドです。

1
2
3
4
class モデル名 < ApplicationRecord
  validates :~~~~~
  belongs_to :モデル名
end

has_manyメソッドと使用方法は似ていますが、ユーザー視点から見た投稿は1対多数なのでhas_many、投稿視点から見たユーザーは1対1の関係なのでbelongs_toメソッドを使います。基本的にどちらも定義するものだと思っていてください。

 

 

これでユーザーと投稿のアソシエーションが完成したと言えます。

 

 

N+1問題

N+1問題とはアソシエーションを利用するとデータベースへのアクセス回数が多くなり、アプリケーションのパフォーマンス低下につながることを言います。アソシエーションを利用するとユーザーと複数の投稿のように関連づけられるものが多くなります。例えば、1人のユーザーが投稿を1万回行ったとしたら、データベースへのアクセスも1万回になってしまいます。

 

 

N+1問題の解決方法

 

✔︎Includesメソッドを使おう

includesメソッドは引数で指定された関連性のあるモデルを1度のアクセスにまとめて取得することのできるメソッドです。

書き方は「モデル名.includes(:関連モデル)」といった感じです。今回の例えであれば「ユーザーモデル.includes(:投稿モデル)」という風になります。

 

 

 

今回の記事はここまでになります。また、これからもRailsに関しての情報発信をしていきますのでご覧になってください。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。