Ruby on rails 4 如何在触发[rails]后跳过回调
我有这样一个回调:Ruby on rails 4 如何在触发[rails]后跳过回调,ruby-on-rails-4,callback,Ruby On Rails 4,Callback,我有这样一个回调: 提交:赞助通知后,在:[:创建,:更新] def sponsored_notification current_time = Time.now.in_time_zone(self.try(:timezone)).strftime("%Y-%m-%d %H:%M:%S") if current_time < self.try(:notify_time) && self.try(:is_sent) == false r
提交:赞助通知后,在:[:创建,:更新]
def sponsored_notification
current_time = Time.now.in_time_zone(self.try(:timezone)).strftime("%Y-%m-%d %H:%M:%S")
if current_time < self.try(:notify_time) && self.try(:is_sent) == false
run_time = self.updated_at + (self.try(:notify_time) - current_time.to_time).seconds
SponsoredNotificationWorker.perform_at(run_time, self.id)
end
end
def赞助商通知
当前\u时间=时间。现在。在\u时区(self.try(:时区)).strftime(%Y-%m-%d%H:%m:%S)
如果当前时间
我的问题是当我创建一个赞助商然后更新它时,我收到了两个通知,但我只想收到一个,最新的赞助商信息应该被发送。我想在这种情况下,回调被触发了两次。如果发生更新,如何跳过创建的操作?我认为您需要重新思考您的流程,然后重构代码以添加片段以实现您所描述的内容 每次您
:创建
或:更新
模型时,您添加的回调都会触发,即,如果您创建并更新模型,则会触发两次。如果您在每次调用时让一个工作人员排队,那么您将在传递给perform\u的运行时执行该调用
根据你在这里的最终目标,你可以做很多事情。无论后续更新如何,是否要通知一次?或者你只是不想让用户收到大量通知
在第一种情况下,我将逻辑转移到worker:
- 保持回调如下(好吧,重构它以简化代码)
- 将
notified
布尔标志添加到您在作业排队时设置为true
的模型中,即在回调的最后一步李>
- 在worker中,检索对象,如果它以前被
通知过
,则只需跳过,什么也不做李>
- 然后,您可以使用普通的
perform\u async
更改perform\u at
在第二种情况下,您可能希望使用类似“通知第一件事,然后等待1小时,不通知任何其他事情”的内容
- 在
属性处更改datetimenotified_的布尔值,并将其存储到回调中的Time.current
李>
定义将通知分组的时间窗口,例如在模型通知\u window=1
中,以常量为单位,例如以小时为单位李>
在worker中,将逻辑更改为检查your#object#notified_at
与your object#NOTIFICATION_WINDOW.hours.ago
以查看是否需要通知或放弃李>
将您的perform\u at
也更改为perform\u async
,因此立即通知并保持沉默一小时
请记住,此方法将通知第一件事(:create
),并且在一小时内不对下一件事执行任何数量的:update
李>
如果您想要更智能的东西,比如“将一堆通知分组”并一起发送,那么您需要一种不同的方法。例如,在数据库中写入通知
条目,其中包含一些已通知的
布尔标志,然后安排rake
任务从数据库中获取所有未通知的
通知
并按您喜欢的方式分组发送它们。这将意味着从当前回调中删除该工作人员,并创建一个不同的工作人员,该工作人员将定期安排(每5分钟?每小时?)
这些想法可能符合您的要求。首先要弄清楚,尝试一些东西,也许我们可以缩小范围 你能添加更多的代码吗detail@Usar编辑后,对于第一次阅读它的人来说,逻辑相当复杂,但我的目标只是处理回调,为什么不在创建通知之前先使用find_或create_by检查赞助商的演示