[Ruby]グループ機能を一覧に表示[pluckメソッド・joinメソッド]
結局ポートフォリオで使わなかったけど、ビューに下記のように書くことで…
<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(", ") %>
このpluck
やjoin
は、データの取得や加工の処理。こういったものは今回のビューだけでなく、他の画面でも使用する可能性が考えられる。
つまり、ロジックになるので、Helper / Decorator / ViewObjectを使うといい。
詳細は、こちらの記事にまとめました!
参考文献
Discussion