Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 如何在触发[rails]后跳过回调_Ruby On Rails 4_Callback - Fatal编程技术网

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小时,不通知任何其他事情”的内容

属性处更改datetime
notified_的布尔值,并将其存储到回调中的
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检查赞助商的演示