Sidekiq将在上个月和当月结束时执行操作

时间:2017-03-11 07:35:44

标签: ruby-on-rails ruby date sidekiq

我有这个逻辑,但发现难以投入代码;我可以但不确定何时使用Sidekiq执行此操作

  

将上个月的费用与本月费用(本日历月末)进行比较

工人阶级:

def perform(*args) # params left out for this example
  [...]
  last_month = user.expenses.where(date: 1.month.ago) # ie Jan
  this_month = user.expenses.where(date: Date.today.at_beginning_of_month..Date.today.end_of_month) # ie Feb (end of Feb)

  # Then my if else here
end

控制器:

CompareExpenseWorker.perform_in(...)

我被困在那里。什么时候应该这样做?在1或2个月内?

我觉得我的想法是在玩我的游戏。如果我在1个月内执行,我将只在上个月而不是当月(完整日历月)。如果在2个月内完成,我觉得这不正确。是吗?

1 个答案:

答案 0 :(得分:2)

首先,last_month的计算应为:

# last_month = user.expenses.where(date: 1.month.ago) # incorrect
last_month = user.expenses.where(
  date: 1.month.ago.beginning_of_month..1.month.ago.end_of_month)

我相信,整个逻辑应该改变。如果你想比较整整两个月,那就应该这样做:

month_2 = user.expenses.where( # e.g. Feb
  date: 2.month.ago.beginning_of_month..2.month.ago.end_of_month)
month_1 = user.expenses.where( # e.g. Mar
  date: 1.month.ago.beginning_of_month..1.month.ago.end_of_month)
# run at any day in April, to compare two full months
# user_id is the id of the user to build reports for
CompareExpenseWorker.perform(user_id)

此外,我不认为应该将CompareExpenseWorker的呼叫放入控制器,使用cronjob来计划,每月1日安排。