工作人员找不到新添加的记录

时间:2010-02-10 00:36:42

标签: ruby-on-rails ruby workling starling-server

我正在使用Starling和Workling来处理我的应用程序中的后台任务,这是一个Swoopo风格的拍卖网站。在这种情况下,后台任务是监视拍卖并通知获胜者的通知系统。在创建拍卖对象时调用监视器。我的问题是我的监控代码无法找到它应该监控的拍卖。这是代码:

单元测试失败:

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

调用worker的代码:

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

每次运行测试时,都会收到错误消息,告诉我无法找到提供给工作人员的拍卖。

有没有人有任何想法?我在Mac OSX 10.6.2 Macbook Pro上使用rails 2.3.5,sqlite3和最新的Starling,Workling以及所有其他相关的宝石,如果有帮助的话。

感谢您的所有意见。

1 个答案:

答案 0 :(得分:0)

你应该因为创造“swoopo-style”拍卖而受到抨击,我觉得很难帮助你。

  

after_create()之后调用   对没有的新对象进行Base.save   已保存(不存在记录)

所以after_create有点用词不当 - 记录还没有真正创建。

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

你可以添加你自己的id字段,并让工作过程在db中搜索该id,每次找不到它时都会休息几秒钟(达到预设的故障限制)。

或者 - 您可以尝试在数据库更新后调用的github上的几个after_commit插件之一。

这是一个:

http://github.com/delynn/after_commit