이벤트 close 기능을 만들어 보았다 (논리 삭제)
하고 싶은 일
포트폴리오로서 이벤트 투고 앱을 작성 중 이벤트 개최일이 지난 이벤트의 취급을 어떻게 할까라고 조사하고 있으면 논리 삭제의 존재를 알았으므로 이벤트를 논리 삭제해 이벤트를 폐쇄하는 기능을 자작했다.
기능 요구사항
구현 전에 이번 기능 요건을 정리하면,
① 이벤트 기한이 지난 이벤트를 논리 삭제
구체적으로는
구현 전에 이번 기능 요건을 정리하면,
① 이벤트 기한이 지난 이벤트를 논리 삭제
구체적으로는
② 논리 삭제는 이벤트 기일이 지나면 자동으로 실행
구체적으로는
구현
그럼 구현 시작!
① 이벤트 기한이 지난 이벤트를 논리 삭제
이벤트 컬럼에 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.rakenamespace :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 사용
Gemfilegem 'whenever', require: false
터미널$ bundle install
설정 파일 설치
터미널$ bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!
설정을 작성하고 rake 작업이 매일 아침 6시에 실행되도록 설정
config/schedule.rbrequire 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
요약
구현하기 전에 기능 요건과 기능 구현의 흐름을 구체적으로 함으로써 원활하게 구현할 수 있었다.
기능을 자작하는 것은 힘들었지만 매우 즐거웠습니다!
Reference
이 문제에 관하여(이벤트 close 기능을 만들어 보았다 (논리 삭제)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/aaaasahi_17/items/c9a011b085ecc076bca1
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ 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
- if @event.status?
.btn.btn-danger 終了
- else
.btn.btn-primary 参加する
Event.where('start_time < ?', Date.today).where(status: false).update_all(status: true)
$ rails g task close_event
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
gem 'whenever', require: false
$ bundle install
$ bundle exec wheneverize .
[add] writing `./config/schedule.rb'
[done] wheneverized!
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
$ bundle exec whenever --update-crontab
구현하기 전에 기능 요건과 기능 구현의 흐름을 구체적으로 함으로써 원활하게 구현할 수 있었다.
기능을 자작하는 것은 힘들었지만 매우 즐거웠습니다!
Reference
이 문제에 관하여(이벤트 close 기능을 만들어 보았다 (논리 삭제)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/aaaasahi_17/items/c9a011b085ecc076bca1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)