0

Swoopo スタイルのオークション サイトであるアプリケーションで、バックグラウンド タスクを処理するために Starling と Workling を使用しています。この場合、バックグラウンド タスクは、オークションを監視して勝者に通知する通知システムです。モニタは、オークション オブジェクトの作成時に呼び出されます。私の問題は、監視コードが監視対象のオークションを見つけられないことです。コードは次のとおりです。

失敗する単体テスト:

class AuctionTest < ActiveSupport::TestCase
  test "are monitored when created" do
    auction = Auction.new(
      :name => "A TV",
      :markdown => "A large TV",
      :starting_bid => 0.01,
      :bid_increment => 0.01,
      :starts_at => Time.now(),
      :ends_at => Time.now() + 5.seconds,
      :active => true
    )
    auction.save
    Bid.place(@current_user, auction)

    sleep(10) #when bids are placed, time is added to the end of the auction so wait

    assert auction.won?
    assert_equal @current_user.id, auction.winner_id
  end
end

ワーカーコード:

class AuctionsWorker < Workling::Base
  def monitor(options)
    active = true
    ends_at = options[:original_ends_at]
    while active
      auction = Auction.find(options[:auction_id]) #this is the record that cannot be found
      if auction.won?
        active = false
        winner = User.find(auction.high_bidder).id
        auction.update_attribute(:winner_id, winner)
      else
        until Time.now() >= ends_at
          sleep(1)
        end
      end
    end
  end
end

ワーカーを呼び出すコード:

class Auction < ActiveRecord::Base
  def after_create
    AuctionsWorker.asynch_monitor(:auction_id => self.id, :original_ends_at => self.ends_at) if self.active?
  end
end

テストを実行するたびに、ワーカーに提供されたオークションが見つからないというエラーが表示されます。

誰にもアイデアはありますか?Rails 2.3.5、sqlite3、および最新の Starling、Workling、およびその他の関連するすべての gem を Mac OSX 10.6.2 Macbook Pro で使用しています。

すべての入力に感謝します。

4

1 に答える 1

0

あなたは「スウポスタイル」のオークションを作成することに反対票を投じるべきです、そして私はあなたを助けるために汚い気がします。

after_create()まだ保存されていない(レコードが存在しない)新しいオブジェクトに対してBase.saveの後に呼び出されます

したがって、after_createは少し誤称です。つまり、レコードはまだ実際には作成されていません。

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M002142

独自のIDフィールドを追加し、作業プロセスにそのIDをデータベースで検索させ、IDが見つからないたびに数秒間スリープさせることができます(事前設定された障害制限まで)。

または、データベースが更新された後に呼び出されるgithubにあるいくつかのafter_commitプラグインの1つを試すことができます。

これが1つです:

http://github.com/delynn/after_commit

于 2010-02-10T00:46:14.000 に答える