When gem 및 Cron 작업을 사용하여 Rails에서 월별 업데이트 캘린더 만들기

Flatiron School과 함께하는 최종 포트폴리오 프로젝트를 위해 이전에 Sinatra로 만든 앱을 React로 업데이트하고 추가 기능도 추가했습니다. 이 앱을 통해 사용자는 집에서 식물 관리, 특히 식물에 필요한 물 공급을 추적할 수 있습니다. 사용자는 프런트 엔드에서 급수 일정을 렌더링하는 달력(React Calendar로 생성됨)을 보았습니다. 캘린더 데이터는 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 파일을 작성합니다. cronherehere에 대한 자세한 내용을 읽을 수 있습니다. 기본적으로 cron을 사용하면 지정된 간격으로 백그라운드 작업을 실행할 수 있으며 crontab은 이러한 작업을 이름별로 추적합니다.

프로덕션 환경(기본값)의 경우 다음을 실행합니다.

bundle exec whenever --update-crontab 


개발 작업을 할 때 개발 플래그--set environment='development'를 추가하고 다음을 실행합니다.

bundle exec whenever --update-crontab --set environment='development'


이제 cron 작업은 달력을 업데이트하기 위해 한 달에 한 번 rake 작업을 실행하도록 모두 설정되었습니다.

좋은 웹페이지 즐겨찾기