2017-04-13 2 views
1

je le travailleur suivant dans mon application webResque Travailleur: Objets et méthodes non disponibles dans travailleur

class TweetSender 
    @queue = :tweets_queue 

     def self.perform(tweet_id) 
      message = Tweet.where(:status_id => 0).order(:created_at, :id).limit(1) 
      message.update_attribute(status_id = 1) 
      $client.update(message.text) 

     end 
end 

Il se schedueled par le tweet_scheduler.yml resque-programmateur suivant

tweet_sender:

cron: "0 20 * * * Europe/Stockholm" 
    class: "TweetSender" 
    queue: tweets_queue 
    args: tweet_id 
    description: "This job sends daily tweets from the content db" 

qui obtient défini par resque.rake il

require 'resque/tasks' 
require 'resque/scheduler/tasks' 
task 'resque:setup' => :environment 

namespace :resque do 
    task :setup do 
    require 'resque' 


    end 

    task :setup_schedule => :setup do 
    require 'resque-scheduler' 
    Resque.schedule = YAML.load_file('tweet_schedule.yml') 
    require 'jobs' 
end 
task :scheduler => :setup_schedule 
end 

Dans l'interface Web resque je reçois l'erreur suivante

Exception 
NoMethodError 
Error 
undefined method `update_attribute' for #<Tweet::ActiveRecord_Relation:0x839ca814> 
/home/jan/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/relation/delegation.rb:136:in `method_missing' 
/home/jan/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/relation/delegation.rb:99:in `method_missing' 
/home/jan/Documents/social/app/jobs/tweet_sender.rb:6:in `perform' 

Je alos essayé la mise en œuvre du tweet_sender.rb sans les méthodes de update_atttribute comme si:

class TweetSender 
    @queue = :tweets_queue 

     def self.perform(tweet_id) 
      message = Tweet.where(:status_id => 0).order(:created_at, :id).limit(1) 
      message.status_id = 1 
      message.save 
      $client.update(message.text) 

     end 
end 

Et l'erreur suivante:

Exception 
NoMethodError 
Error 
undefined method `status_id=' for #<Tweet::ActiveRecord_Relation:0x83195bf8> 
/home/jan/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/relation/delegation.rb:136:in `method_missing' 
/home/jan/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.0/lib/active_record/relation/delegation.rb:99:in `method_missing' 
/home/jan/Documents/social/app/jobs/tweet_sender.rb:6:in `perform' 

Pourquoi mes méthodes et les emthods de rails standard ne sont-ils pas disponibles chez mon employé? Dois-je les exiger explicitement quelque part?

Répondre

1

limit renvoie une instance de ActiveRecord::Relation.

Ce que vous voulez vraiment obtenir est une instance du modèle Tweet.

Utilisation first:

message = Tweet.where(status_id: 0).order(:created_at, :id).first 
+0

merci, qui fait sens. Je reçois encore il erreur si '' Exception NoMethodError erreur méthode non définie status_id = 'pour nul: NilClass /home/jan/Documents/social/app/jobs/tweet_sender.rb:6:in 'effectuer' ' Maintenant, il ne reconnaît même pas la classe. Des idées? – Jan

+0

@Jan cela signifie que 'first' vous a retourné' nil', ce qui signifie qu'il n'y a pas de résultats satisfaisant vos conditions de requête. –

+1

@AndreyDeneiko vous avez raison, n'a pas l'entrée correspondante dans ma base de données! Merci – Jan