Railsの多対多で、ユーザーが複数のタグを持ち、合計数をcountする

has_and_belongs_to_manyでタグのカウント合計

前回の記事ではタグをseed-fuやorder_as_specifiedといったライブラリを用いて作成していまが、今回はそのタグをユーザーが複数持てるようにして、上の画像のようにタグの一覧表示をした際に、そのタグがいくつ持たれているかを表示するための合計数を取得します。
考え方としてはユーザーは「複数のタグが持てるし、タグも複数のユーザーを持てる関係」になるので、railsのリレーションとしては多対多の関係にしていきます。
いろいろやり方はあるかと思いますが、今回はhas_and_belongs_to_manyを使う方法で実現していきたいと思います。

バージョンはこちらです

Migration

userモデルとtagモデル、それぞれnameカラムを持っているとします。

次にそれらの中間テーブルを作成します。create_tags_usersのところはテーブル名をアルファベット順でつなげます

中間テーブルはidカラムを作成しないようにするため、以下のようにマイグレーションファイルにid: false を追加します。

Models

それぞれのモデルにアソシエーション設定を追記します。

app/models/user.rb

app/models/tag.rb

※ extend OrderAsSpecifiedは前回の記事で入れたgem ‘order_as_specified’のextendです

Controller

ユーザーのストロングパラメータにtag_ids: []を追加しておきます。

app/controllers/users_controller.rb

Views

ユーザーがタグを選択できるように、タグのチェックボックスを作ります。

app/views/users/_form.html.erb

↓このようになるかと思います。
タグのチェックボックス

ユーザーとタグの一覧表示です。

app/views/users/index.html.erb

ここではサンプルとして、10のユーザーデータと、それぞれ適当にタグを持たせています。
ユーザーのタグ一覧

タグのスタイルも記載しておきます。

最後にcountメソッドで合計数を取得したら完成です。

以上です!ご覧いただき、ありがとうございました!😁


投稿者:

Shuji

読書したり、プログラミングしたりしています。何かアウトプットできそうなものがあれば投稿していきたいと思います。