#前回投稿した記事の応用編
sampleメソッドを使って、より応用したBooleanの「true, false」を切り替えたいと思います。
この記事が少しでも良かったと思ったらLGTMを押していただけたら嬉しいです!!
##前提条件
group:memberrをたくさん持つ
member :たくさんのgroupに所属する
group_member : 中間テーブル
グループとメンバーは多対多の関係です!
そして、グループに加入したメンバーの中からランダムに幹事を設定できること。
流れとしては、
自動設定するを押すとグループに参加のメンバーの中から、
Role(役割)が、organizer(幹事)かregularにランダムに変わります。
今回はsampleメソッドを使うので、少し制限もつけます。
①幹事は一グループにつき一人まで
②メンバーは二回連続で幹事にならない
#やること
中間テーブルに幹事を設定するカラムを追加
rails g migration AddOrganizerToGroupMembers organizer:boolean
booleanのステータス
falseの場合 ⇒ regular
trueの場合 ⇒ organizer
マイグレーションファイルの設定は、defaultをfalseに設定する
class AddOrganizerToGroupMembers < ActiveRecord::Migration[6.1]
def change
add_column :group_members, :organizer, :boolean, default: false
end
end
#ルーティングの設定
resources :groups, only: %i[show new edit create update destroy] do
resources :group_members, only: %i[create destroy]
post 'random_organizer' => 'group_members#organizer'
end
#コントローラーの設定
def organizer
# グループidを取得
group = Group.find(params[:group_id])
# organizerメンバーを1つ取得
organizer = group.group_members.find_by(organizer: true)
# regularメンバーを取得
regular_members = group.group_members.where(organizer: false)
# グループメンバーのregularが存在していれば、ランダムにtrueに変更
regular_members.sample.update(organizer: true) if regular_members.present?
# グループメンバーのorganizerが存在していればorganizerをfalseに変更
organizer.update(organizer: false) if organizer
redirect_to request.referer
end
###解説
①regular_membersでregularメンバーの中から、
sample.updateでランダムに一つだけtrueに切り替える。(regular ⇒ organizer)
②organizer.update(organizer: false) if organizerで幹事を必ずfalseにするので、
絶対に二回連続で幹事にはならない。(organizer ⇒ regular)
#ビュー画面
<%= link_to "自動設定する", group_random_organizer_path(@group), method: :post %>
これでランダムに幹事を設定できると思います!
#最後に
イメージ図の感じだと、まさかこんなに苦労するとは思いませんでした、、(笑)
もっとステップアップしていきたいと思います!!