如何在Ruby on Rails中设置通知的“监视”?

时间:2012-05-01 16:57:05

标签: ruby-on-rails ruby design-patterns

我想为我的Web应用程序设置一个简单的通知系统,该系统是用Ruby on Rails编写的。我的网站是一个简单的拍卖网站,但每个拍卖有两个阶段:5天“无最低出价”阶段,任何人都可以出价和3天“1美元最低出价”阶段,其中只有前10%的投标人阶段可以出价。

我想在拍卖从第一阶段到第二阶段时通知我的用户。这样做的最佳方式是什么?

我想到了两个设计选项:

  • 我不知道RoR有这个,以及这是否是一个有效的系统(因为我想构建一个系统,将有数千名用户参与数百次拍卖 - 无论它是否变得那么大,是无关紧要,这对我来说是学习编写高质量,可扩展的RoR的一个侧面项目。但基本上,当用户竞标拍卖时,他们会成为拍卖中的某种观察者。然后,不知何故,在第5天,所有听众都会收到通知。我不知道在RoR中是如何发生这种触发的(有什么方法可以说“创建5天后触发”还是某种类似的东西?)。总而言之,我想使用Observer模式。

    对我来说,关键问题是试图弄清楚如何在一段时间后触发。我认为,最好的方法是让每次拍卖都有一些设置状态变量称为“拍卖状态”。经过一段时间后,这将会转变,届时拍卖会上的每个观察者都会收到通知。

  • 每天都会在某个设定的时间每天运行一次rake任务。它经历了每次拍卖,如果在第6天进行任何拍卖,则通知该拍卖的观察员。这似乎是一种非常糟糕的方式 - 我喜欢进行有状态拍卖的想法。

思想?

谢谢! 林檎

2 个答案:

答案 0 :(得分:1)

您可以查看https://github.com/pluginaweek/state_machine,特别是转换回调。或者,您也可以使用标准的活动记录回调http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

答案 1 :(得分:0)

看一下https://github.com/bvandenbos/resque-scheduler,如果你还没有听说过,resque是创建后台处理的宝石,在redis中有队列。此gem resque-scheduler允许您指定何时运行任务/作业。

例如,在您的模型中,您将有一个after_create来安排更改出价状态的任务。

  after_create :shedule_state_change

  private
    def record_signup
      Resque.enqueue_in(5.days, ChangeState)
    end

然后您可以通知所有投标人在该任务中的投标或为其创建观察员。