1

Ruby on Rails で作成された Web アプリ用の簡単な通知システムをセットアップしたいと考えています。私のウェブサイトは単純なオークション サイトですが、各オークションには 2 つの段階があります。5 日間の「最低入札価格なし」の段階で誰でも入札できます。段階で入札できます。

オークションが第 1 段階から第 2 段階に移行したときに、ユーザーに通知したいと考えています。これを行う最善の方法は何ですか?

私は2つの設計オプションを考えました:

  • RoRにこれがあるかどうか、またこれが効率的なシステムであるかどうかはわかりません(数百のオークションに数千のユーザーが参加するシステムを構築したいので、それほど大きくなるかどうかは関係ありません。これは一種の高品質でスケーラブルな RoR の書き方を学ぶためのサイド プロジェクトです) が、基本的に、ユーザーがオークションに入札すると、ユーザーはオークションの何らかのオブザーバーになります。その後、どういうわけか 5 日の時点で、すべてのリスナーに通知されます。RoRでそのトリガーがどのように発生するかはわかりません(「作成から5日後にトリガー」などと言う方法はありますか?)。要約すると、Observer パターンを使用したいと思います。

    私にとって重要な問題は、一定時間後にトリガーする方法を見つけようとすることです。それを行う最善の方法は、各オークションに「オークション状態」と呼ばれる状態変数を設定することだと思います。一定期間が経過すると移行し、その時点でオークションのすべてのオブザーバーに通知が送られます。

  • 毎日決まった時間に毎日実行される rake タスクがあります。各オークションを通過し、オークションが 6 日目にある場合は、そのオークションのオブザーバーに通知されます。これはかなり悪い方法のように思えます - 私はステートフルなオークションを行うという考えが好きです。

考え?

ありがとう!りんご

4

2 に答える 2

1

https://github.com/pluginaweek/state_machine、具体的にはトランジション コールバックを見ることができます。または、標準のアクティブ レコード コールバックhttp://api.rubyonrails.org/classes/ActiveRecord/Callbacks.htmlを使用することもできます。

于 2012-05-01T17:28:02.007 に答える
0

まだ聞いたことがない場合は、https://github.com/bvandenbos/resque-schedulerをご覧ください。resque は、redis にキューを持つバックグラウンド処理を作成するための gem です。この gem resque-scheduler を使用すると、タスク/ジョブをいつ実行するかを指定できます。

たとえば、あなたのモデルでは、入札状態を変更するためのタスクをスケジュールするための after_create があります。

  after_create :shedule_state_change

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

そして、そのタスク内でその入札のすべてのビッダーに通知するか、そのためのオブザーバーを作成できます。

于 2012-05-01T17:41:42.293 に答える