2010-10-24 4 views
1

Je souhaite remplacer une étendue existante pour y ajouter une condition supplémentaire. J'ai montré ma tentative de faire cela en utilisant alias_method. Malheureusement, cette approche ne fonctionne pas avec les étendues, j'obtiens une erreur de méthode non définie. Comment puis-je le faire avec des étendues?Surcharge d'une étendue dans les rails 3

module Delayed 
    module Backend 
    module ActiveRecord 
     class Job < ::ActiveRecord::Base 
     belongs_to :queue 

     scope :in_unlocked_queue, lambda { 
      joins(:queue) & Queue.unlocked 
     } 

     alias_method :orig_ready_to_run, :ready_to_run 
     scope :ready_to_run, lambda {|worker_name, max_run_time| 
      orig_ready_to_run(worker_name, max_run_time).in_unlocked_queue 
     } 
     end 
    end 
    end 
end 
+0

Si je me souviens, vous pouvez utiliser des méthodes à la place de champs d'application dans AR3 ... mais je ne suis pas exactement sûr. – Reactormonk

Répondre

2

OK, voici une réponse, pas sûr si c'est le plus propre mais il fonctionne

require 'delayed_job' 

module Delayed 
    module Backend 
    module ActiveRecord 
     class Job < ::ActiveRecord::Base 
     belongs_to :queue 

     scope :in_unlocked_queue, lambda { 
      joins(:queue) & Queue.unlocked 
     } 

     scope :orig_ready_to_run, scopes[:ready_to_run] 
     scope :ready_to_run, lambda {|worker_name, max_run_time| 
      orig_ready_to_run(worker_name, max_run_time).in_unlocked_queue 
     } 
     end 
    end 
    end 
end