2010-02-10 24 views
0

J'utilise Starling et Workling pour traiter les tâches d'arrière-plan dans mon application, un site d'enchères de style Swoopo. Dans ce cas, la tâche d'arrière-plan est un système de notification qui surveille les enchères et notifie le gagnant. Le moniteur est appelé lors de la création de l'objet d'enchères. Mon problème est que mon code de surveillance ne peut pas trouver l'enchère qu'il est censé surveiller. Voici le code:L'ouvrier travaillant ne trouve pas d'enregistrement nouvellement ajouté

Le test unitaire qui échoue:

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 

Le code des travailleurs:

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 

Le code qui appelle le travailleur:

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 

Chaque fois que je lance le test, je reçois une erreur me disant que l'enchère fournie au travailleur ne peut pas être trouvée.

Quelqu'un a-t-il des idées? J'utilise les rails 2.3.5, sqlite3 et le dernier Starling, Workling, et tous les autres gemmes associés sur un Mac OS X Mac OS X 10.6.2 si cela aide.

Merci pour votre contribution.

Répondre

0

Vous devriez être downvoted pour créer une vente aux enchères "swoopo-style", et je me sens sale pour vous aider.

after_create() est appelée après Base.save sur les nouveaux objets qui n'ont pas encore été enregistré (pas d'enregistrement existe)

donc after_create est un peu un abus de langage - la l'enregistrement n'a pas encore été créé.

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

Vous pouvez ajouter votre propre champ id et ont le processus de workling recherche le db pour cet ID, dormir quelques secondes à chaque fois qu'il ne trouve pas (jusqu'à une certaine limite de rupture prédéfinie).

Alternativement - vous pouvez essayer l'un des nombreux plugins after_commit qui sont sur github et qui sont appelés après la mise à jour de la base de données.

est ici un:

http://github.com/delynn/after_commit

+0

je ne vois pas exactement le problème avec ce genre de ventes aux enchères aussi longtemps que vous ne doivent pas induire les gens lors de leur inscription. L'erreur se produit toujours, cependant, et toutes les autres solutions seraient grandement associées si je ne vous ai pas offensé avec mon choix d'application. – mjaz

+0

http://www.codinghorror.com/blog/archives/001196.html – klochner

+0

J'ai déjà lu ce post. Je ne suis pas d'accord avec Atwood que ces sites sont illégaux et l'équivalent logiciel de Satan lui-même. À mon avis, ils ne sont pas plus malfaisants que n'importe quelle plate-forme de jeu sociale, et c'est ce que j'ai l'intention de faire. J'aurais dû réfléchir plus avant de poster une question concernant ce projet particulier ici. – mjaz