Railsで中間テーブルを通じて他のテーブルにアクセスする方法(has_many, through,source)

Railsの学習中に、ユーザーがフォローしているデータだけを抽出するような機能を実装することがあると思います。

その際に、中間テーブルを使うと簡単に実装することができます。その方法をまとめておきます。

今回は、ユーザー(user)がフォロー(follow)している掲示板(board)だけを表示させてみます。

モデル

User、Board、Followモデルはそれぞれ下記のように実装します。

ポイントは、Userモデルのhas_many :following_boards, through: :follows, source: :boardの部分です。following_boardsというモデルは架空のモデルで、そのfollowing_boardsは中間テーブルfollowsを経由して、boardモデルを参照していることを説明しています。

class User < ApplicationRecord
  has_many :boards, dependent: :destroy
  has_many :follows, dependent: :destroy
  has_many :following_boards, through: :follows, source: :board
end

class Board < ApplicationRecord
    belongs_to :user
    has_many :follows, dependent: :destroy
end


class Follow < ApplicationRecord
    belongs_to :user
    belongs_to :board
end

準備はこれだけです。

コントローラー

上記のようにモデルで設定を行うと、コントローラーで、ログイン中のユーザー(current_user)がフォローしている掲示板(@boards)が下記のように簡単に定義できます。

user = User.find_by(id: current_user.id)        
@boards = user.following_boards

今回は、1対多のケースでしたが、Twitterのフォロー機能のように多対多のケースでは、実装が複雑になります。ですが、上記の考え方が理解できていれば、サクッと応用できると思います。

参考:Railsでフォロー機能を作る方法

Ruby on Railsをこれから本格的に勉強したい人は「エンジニアになるための600時間のプログラミング学習に耐え抜くコツ」という記事がおすすめです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする