2011-02-05 3 views
0

J'essaie d'utiliser le code ci-dessous pour étendre l'enregistrement actif afin que ma classe de commande soit un peu plus propre. Cela ne fonctionne cependant pas.ActiveRecord :: Extension de base ne fonctionne pas

class ActiveRecord::Base 
    def self.has_statuses(*status_names) 
    validates :status, 
       :presence => true, 
       :inclusion => { :in => status_names} 

    status_names.each do |status_name| 
     scope "all_#{status_name}", where(:status => status_name) 
    end 

    status_names.each do |status_name| 
     define_method "#{status_name}?" do 
     status == status_name 
     end 
    end 
    end 
end 

En environment.rb je requiers l'extension ci-dessus avec

require "#{Rails.root}/lib/active_record_extensions.rb" 

Si je d'autre part crée une classe de base abstraite OrderBase et laisser mon Hériter de la classe de commande à partir de ce lieu qu'il fonctionne comme prévu . Que dois-je faire pour que mon patch de singe "prenne"?

EDIT: J'ai oublié de mentionner que je reçois un message indiquant la méthode manquante pour has_statuses.

EDIT2: Le code ci-dessus fonctionne dans la console (rails c), mais il ne fonctionne pas dans le test

EDIT3: J'ai changé l'environnement/test.rb à config.cache_classes = faux et qui semble faire l'affaire. De toute évidence, il y a beaucoup à apprendre :)

+0

Cela fonctionne en fait pour moi, comment utilisez-vous cette méthode? – seeingidog

+0

J'essaye de l'employer dans ma classe d'ordre comme: has_statuses: a créé,: in_progress,: a expédié etc. pour garder la classe propre. – mhenrixon

+0

@seeingidog err maintenant il travaille pour moi aussi et je n'ai aucune idée de ce qui est différent .... J'ai évidemment fait quelque chose mais je ne sais pas quoi. Postez une réponse en disant que cela devrait fonctionner et je vais marquer cela comme la réponse! – mhenrixon

Répondre

0

J'ai ajouté le besoin d'en haut de ma classe de commande

require "#{Rails.root}/lib/active_record_extensions.rb" 
class Order < ActiveRecord::Base 
0

Où stockez-vous ce code d'extension? J'ai découvert que les extensions des classes Rails importantes ne fonctionnent pas depuis le répertoire "config/initializers /" (où je préfère les garder, par souci d'ordre), mais fonctionnent si j'attache le code d'extension au fin de "config/environment.rb" (ce que je n'aime pas du tout, parce que ça devient vraiment salissant). Je n'ai jamais compris pourquoi.

Je suis sur Rails 2.3.8, donc si vous êtes sur Rails 3, cela ne peut plus s'appliquer ...

EDIT:

J'ai oublié l'autre truc qu'il a fallu pour obtenir une ActiveRecord::Base extension de travail - les méthodes (méthodes de classe, au moins - je ne l'ai pas fait avec une méthode d'instance) doivent être déclarées dans la métaclasse (je pense que c'est ce qu'on appelle ...). Voici mon travail ActiveRecord::Base extension:

ActiveRecord::Base.class_eval do 
    class << self 
     def find_with_benchmark(*args) 
      bg = Time.now 
      ret = find_without_benchmark(*args) 
      MyLogger.ar_time += Time.now - bg 
      MyLogger.ar_count += 1 
      return ret 
     end 

     alias_method_chain :find, :benchmark 
    end 
end 
+0

merci, j'ai aussi essayé d'inclure le code à la fin de environment.rb mais obtenir le même résultat. Méthode manquante :( – mhenrixon

+0

@mhenrixon Oh, attendez, j'ai oublié quelque chose d'autre que je devais faire pour que mon extension 'ActiveRecord :: Base' fonctionne ... Je vais ajouter à ma réponse - une minute ... –

+0

Pour ce faire, je suis confronté à un problème où il se plaint d 'un \ n attendu inattendu [ou alors je suppose qu'il ya eu des changements dans la façon dont cela fonctionne. – mhenrixon

Questions connexes