When gem 및 Cron 작업을 사용하여 Rails에서 월별 업데이트 캘린더 만들기
PlantEvent
모델 및 데이터베이스와 함께 백엔드에서 유지되었습니다. 지정된 시간에 데이터베이스가 담당하는 데이터의 양을 제한하기 위해 plant_events
테이블이 현재 월의 일정으로 매월 1일에 업데이트됩니다. 따라서 지난 달의 데이터를 삭제하고 현재 달의 새 데이터베이스 행을 인스턴스화하는 반복 메서드를 구현해야 했습니다.반복되는 작업을 구현하기 위해 팔로우했습니다. 아래 단계는
whenever
gem으로 한 달에 한 번 Rake 작업을 실행하도록 Cron 작업을 설정하는 방법을 보여줍니다.1단계. gem을 추가하고 config/schedule.rb 파일을 설정합니다.
다음을 사용하여 whenever gem을 Gemfile에 추가합니다.
gem 'whenever', require: false
그런 다음 터미널에서
bundle
를 실행합니다.번들링 후 Rails 애플리케이션의 루트에서
bundle exec wheneverize .
를 실행합니다. 이렇게 하면 일정을 작성할 수 있는 config/schedule.rb
라는 파일이 생성됩니다.2단계. config/schedule.rb에서 크론 작업에 대한 일정을 생성합니다.
whenever
gem에는 일반적으로 사용되는 시간에 대한 몇 가지 기본 속기 호출이 있습니다. 매월 1일 자정에 작업을 실행하려면 기본 제공 1.month
shortcut을 사용하면 됩니다.# config/schedule.rb
every 1.month do
rake 'calendar:update_calendar'
end
그러면
update_calendar
아래에 네임스페이스가 지정된 calendar
라는 Rake 작업이 호출됩니다.3단계. 호출 시 필요한 작업을 수행할 Rake 작업 생성
Rails 생성기를 사용하여 다음을 사용하여 Rake 작업 파일을 생성할 수 있습니다.
rails g task calendar update_calendar
이렇게 하면 다음 상용구 코드가 포함된
lib/tasks/calendar.rake
라는 파일이 생성됩니다.# lib/tasks/calendar.rake
namespace :calendar do
desc "TODO"
task update_calendar: :environment do
end
end
desc
행을 편집하여 작업이 수행하는 작업을 설명하고 블록 내에서 작업을 수행하는 코드를 추가합니다. 작업 내에서 loads your environment (including ActiveRecord models)이 무엇인지 environment
줄을 유지해야 합니다. 이제 파일은 다음과 같습니다.namespace :calendar do
desc "delete previous month's calendar events and populate current month"
task update_calendar: :environment do
PlantEvent.delete_all
Plant.find_each do |plant|
if plant.watering_repeat_rate_days
plant.build_plant_events_collection(plant.watering_repeat_rate_days)
end
end
end
end
이 경우 기존
plant_events
이 모두 삭제됩니다. 그런 다음 각 plant
는 이번 달에 대한 plant_events
컬렉션을 인스턴스화합니다.참고로
Plant
모델은 다음과 같습니다.# app/models/plant.rb
require 'date'
require 'active_support'
class Plant < ApplicationRecord
belongs_to :user
has_many :plant_events, dependent: :destroy
def build_plant_events_collection(watering_repeat_rate_days, start_date = Date.today)
event_date = start_date
if watering_repeat_rate_days
while event_date < start_date.at_beginning_of_month.next_month
self.plant_events.create(date: event_date, event_type: "water")
event_date = event_date.advance(days: watering_repeat_rate_days)
end
end
end
end
4단계. 작업에 대한 crontab 파일 작성
마지막으로 cron 작업을 확인하고 백그라운드에서 실행하는 crontab 파일을 작성합니다. cronhere 및 here에 대한 자세한 내용을 읽을 수 있습니다. 기본적으로 cron을 사용하면 지정된 간격으로 백그라운드 작업을 실행할 수 있으며 crontab은 이러한 작업을 이름별로 추적합니다.
프로덕션 환경(기본값)의 경우 다음을 실행합니다.
bundle exec whenever --update-crontab
개발 작업을 할 때 개발 플래그
--set environment='development'
를 추가하고 다음을 실행합니다.bundle exec whenever --update-crontab --set environment='development'
이제 cron 작업은 달력을 업데이트하기 위해 한 달에 한 번 rake 작업을 실행하도록 모두 설정되었습니다.
Reference
이 문제에 관하여(When gem 및 Cron 작업을 사용하여 Rails에서 월별 업데이트 캘린더 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/smilesforgood/creating-a-monthly-updating-calendar-in-rails-with-whenever-gem-and-a-cron-job-5e6h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)