이벤트 close 기능을 만들어 보았다 (논리 삭제)

8256 단어 초보자Rails

하고 싶은 일



포트폴리오로서 이벤트 투고 앱을 작성 중 이벤트 개최일이 지난 이벤트의 취급을 어떻게 할까라고 조사하고 있으면 논리 삭제의 존재를 알았으므로 이벤트를 논리 삭제해 이벤트를 폐쇄하는 기능을 자작했다.

기능 요구사항



구현 전에 이번 기능 요건을 정리하면,

① 이벤트 기한이 지난 이벤트를 논리 삭제



구체적으로는
  • 이벤트 컬럼에 boolean을 갖게 한다
  • 개최일이 지난 이벤트의 boolean 상태로 View의 표시를 변경한다

  • ② 논리 삭제는 이벤트 기일이 지나면 자동으로 실행



    구체적으로는
  • 이벤트 개최일이 지나면 boolean을 변경하는 메소드를 정의
  • 그 메소드를 rake 태스크에 등록
  • rake 작업을 정기적으로 실행합니다

  • 구현



    그럼 구현 시작!

    ① 이벤트 기한이 지난 이벤트를 논리 삭제



    이벤트 컬럼에 boolean을 갖게 한다.



    명명은 이번은 status로서 디폴트를 false로 설정한다

    콘솔
    $ rails g migration AddStatusToEvents status:boolean
    
    class AddStatusToEvents < ActiveRecord::Migration[6.1]
      def change
        add_column :events, :status, :boolean,  default: false
      end
    end
    

    콘솔
    $ rails db:migrate
    

    개최일이 지난 이벤트의 boolean 상태로 View의 표시를 변경



    하기 쉽다
    view의 표시를 조건 분기하는 것만

    보기
    - if @event.status?
      .btn.btn-danger 終了
    - else
      .btn.btn-primary 参加する
    

    화면으로 표현하면 이런 느낌

    false일 때(통상시)



    true일 때(개최일이 지났다)



    이것으로 이벤트의 개최일이 지났던 것이 일목요연!

    ② 논리 삭제는 이벤트 기일이 지나면 자동으로 실행



    이벤트 개최일이 지나면 boolean을 변경하는 메소드를 정의



    여기가 왠지 가장 고민한 곳
    날짜의 처리를 어떻게 할지 여러가지 조사한 결과 이하와 같은 형태로
    rails는 Date.today에 오늘 일이 다는 것을 처음으로 알았다.
     Event.where('start_time < ?', Date.today).where(status: false).update_all(status: true)
    

    그 메소드를 rake 태스크에 등록



    나중에 정기적으로 실행하기 위해 rake 작업에 등록

    터미널
    $ rails g task close_event
    

    lib/tasks/close_event.rake
    namespace :close_event do
      desc "イベント開催日が過ぎたらイベントをcloseする"
      task close_event: :environment do
        Event.where('start_time < ?', Date.today).where(status: false).update(status: true)
      end
    end
    
    

    일단 여기서 동작 확인

    터미널
    $ rake close_event:close_event
    

    rake 태스크 정기 실행



    정기 실행에는 whenever 사용

    Gemfile
    gem 'whenever', require: false
    

    터미널
    $ bundle install
    

    설정 파일 설치

    터미널
    $ bundle exec wheneverize .
    
    [add] writing `./config/schedule.rb'
    [done] wheneverized!
    

    설정을 작성하고 rake 작업이 매일 아침 6시에 실행되도록 설정

    config/schedule.rb
    require File.expand_path(File.dirname(__FILE__) + '/environment')
    # cronを実行する環境変数
    rails_env = ENV['RAILS_ENV'] || :development
    # cronを実行する環境変数をセット
    set :environment, rails_env
    # cronのログの吐き出し場所
    set :output, "#{Rails.root}/log/cron.log"
    
    # 時間指定
    every 1.day, at: '6am' do 
      rake 'close_event:close_event'
    end
    

    cron을 업데이트하여 완성

    터미널
    $ bundle exec whenever --update-crontab 
    

    요약



    구현하기 전에 기능 요건과 기능 구현의 흐름을 구체적으로 함으로써 원활하게 구현할 수 있었다.
    기능을 자작하는 것은 힘들었지만 매우 즐거웠습니다!

    좋은 웹페이지 즐겨찾기