👻

[Ruby]グループ機能を一覧に表示[pluckメソッド・joinメソッド]

2025/02/09に公開

結局ポートフォリオで使わなかったけど、ビューに下記のように書くことで…

<span class="task-meta">
    管理者: <%= user.owned_groups.pluck(:name).join(", ") %> /
    所属: <%= user.groups.pluck(:name).join(", ") %> /
    合計投稿件数:<%= user.tasks.count %>
</span>

これで上記のように管理してるグループと所属してるグループ名を一覧画面に表示できる。
user.owned_groups・user.group_memberships から、グループの名前のみを取得し、カンマで区切って表示させている。

たくさんグループに所属・管理してると長くなってしまうので、これは結局使いませんでしたが…。
pluckメソッド・joinメソッドははじめて触れたのでまとめます!


pluckメソッド

pluck は、ActiveRecordのメソッド で、データベースから指定したカラム(この場合は name)の値だけを配列として取得するために使う。

<%= user.owned_groups.pluck(:name).join(", ") %>

joinメソッド

joinメソッドを使うことで、特定の文字列を挟んで配列を作成することができる。


所属グループの書き方

所属: <%= user.group_memberships.pluck(:name).join(", ") %>

上記だと、 "name" という文字列だけが表示され、所属しているグループ名が表示されない。
group_memberships は中間テーブルなので、グループ名は取得できない
(中間テーブルに、nameカラムは存在しない)

下記のように、groupsテーブルのnameカラムを取得するようにすることで正しく表示できる。

所属: <%= user.groups.pluck(:name).join(", ") %>

User モデル

class User < ApplicationRecord
  has_many :group_memberships
  has_many :groups, through: :group_memberships  # ここが重要
end

GroupMembership モデル(中間テーブル)

class GroupMembership < ApplicationRecord
  belongs_to :user
  belongs_to :group
end

Group モデル

class Group < ApplicationRecord
  has_many :group_memberships
  has_many :users, through: :group_memberships
end

追記(先輩から教えていただいたこと)

今回みたいなメソッドをビューファイルで呼び出すことは基本的にしないらしい!

Viewにロジックを書かない

ViewはHTMLの構造を決める部分なので、できるだけロジック(処理)を書かずに、データの表示に専念させるのが良い。

管理者: <%= user.owned_groups.pluck(:name).join(", ") %>

このpluckjoinは、データの取得や加工の処理。こういったものは今回のビューだけでなく、他の画面でも使用する可能性が考えられる。
つまり、ロジックになるので、Helper / Decorator / ViewObjectを使うといい。

詳細は、こちらの記事にまとめました!


参考文献

https://railsguides.jp/active_record_querying.html
https://qiita.com/k-o-u/items/31e4a2f9f5d2a3c7867f
https://pikawaka.com/rails/pluck
https://www.sejuku.net/blog/14743
https://docs.ruby-lang.org/ja/latest/method/Array/i/join.html

Discussion