LoginSignup
0
0

More than 1 year has passed since last update.

幹事をランダムに設定する

Posted at

前回投稿した記事の応用編

sampleメソッドを使って、より応用したBooleanの「true, false」を切り替えたいと思います。

この記事が少しでも良かったと思ったらLGTMを押していただけたら嬉しいです!!

前提条件

group:memberrをたくさん持つ
member :たくさんのgroupに所属する
group_member : 中間テーブル

グループとメンバーは多対多の関係です!
そして、グループに加入したメンバーの中からランダムに幹事を設定できること。

流れとしては、
自動設定するを押すとグループに参加のメンバーの中から、
Role(役割)が、organizer(幹事)かregularにランダムに変わります。

今回はsampleメソッドを使うので、少し制限もつけます。
①幹事は一グループにつき一人まで
②メンバーは二回連続で幹事にならない

イメージ図

qiita_boolean.png

やること

中間テーブルに幹事を設定するカラムを追加

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 %>

これでランダムに幹事を設定できると思います!

最後に

イメージ図の感じだと、まさかこんなに苦労するとは思いませんでした、、(笑)
もっとステップアップしていきたいと思います!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0