총무를 무작위로 설정

5333 단어 루비Rails

지난번 게시한 기사의 응용편



sample 메소드를 사용해, 보다 응용한 Boolean의 「true, false」를 전환하고 싶습니다.

이 기사가 조금이라도 좋았다고 생각하면 LGTM을 눌러 주시면 기쁩니다! !

전제 조건



group: members 많은
member : 많은 group에 소속된다
group_member : 중간 테이블

그룹과 멤버는 다 대다 관계입니다!
그리고 그룹에 가입한 멤버 중에서 랜덤하게 간사를 설정할 수 있는 것.

흐름으로서는
자동설정을 누르면 그룹에 참여하는 멤버 중에서
Role(역할)이 organizer(간사) 또는 regular로 무작위로 바뀝니다.

이번에는 sample 메소드를 사용하기 때문에 조금 제한도 붙입니다.
① 간사는 한 그룹당 한 명까지
② 멤버는 2회 연속으로 간사가 되지 않는다

이미지 다이어그램





할 일



중간 테이블에 총무를 설정하는 열 추가
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 %>

이제 무작위로 간사를 설정할 수 있다고 생각합니다!

마지막으로



이미지도의 느낌이라고 설마 이렇게 고생한다고는 생각하지 않았습니다,, (웃음)
더 스텝 업 해 가고 싶습니다! !

좋은 웹페이지 즐겨찾기