2010-05-11 5 views
2

Dans le même ordre d'idée que this question, je souhaite appeler le acts_as_reportable à l'intérieur de chaque modèle pour pouvoir effectuer des rapports manuels ponctuels dans la console de mon environnement de développement (avec un vidage du Données de production).Méthode DRY d'appel d'une méthode dans chaque modèle de rails

Quelle est la meilleure façon de faire cela? Mettre acts_as_reportable if ENV['RAILS_ENV'] == "development" dans chaque modèle devient ennuyeux et n'est pas très SEC du tout. Tout le monde dit que le rapiéçage de singe est le diable, mais un mélange semble être trop lourd.

Merci!

Répondre

1

Qu'en est-il de créer une classe Reportable et d'en déduire tous les modèles?

class Reportable 
    acts_as_reportable if ENV['RAILS_ENV'] == "development" 
end 

class MyModel < Reportable 
end 
+0

Ha! C'est fondamentalement l'équivalent de l'ApplicationController, comme le mentionne Throlkim. Si c'était une si bonne idée - à quoi cela me ressemble - pourquoi n'est-ce pas déjà fait? Ce serait un excellent moyen de continuer à sécher les choses. Je pense que je devrais commencer à faire cela naturellement. À l'heure actuelle, je vais devoir faire quelques regex pour trouver et remplacer toutes mes classes. Je pense que je vais aller pour le plus générique ApplicationModel cependant. ;-) – tjmcewan

1

J'utilise un mixin pour les méthodes communes à tous mes modèles:

module ModelMixins 
    # Splits a comma separated list of categories and associates them 
    def process_new_categories(new_categories) 
     unless new_categories.nil? 
     for title in new_categories.split(",") 
      self.categories << Category.find_or_create_by_title(title.strip.capitalize) 
     end 
     self.update_counter_caches 
     end 
    end 
end 

Je considérais le faire d'une autre façon, mais pour moi, cela semble être la façon la plus légitime de se tarir vos modèles . Un modèle équivalent à ApplicationController serait une bonne solution, même si je ne suis pas sûr de savoir comment vous y prendre, ou s'il y a un argument décent.

+0

J'ai vu cette façon de faire, et même si cela semblait être exagéré, j'en ai réfléchi un peu. Pour autant que je puisse voir, cela va ajouter une nouvelle méthode à la classe. Je veux appeler un autre code qui ajoute des méthodes à la classe, pas directement ajouter les méthodes moi-même. Donc, il faudrait une méthode d'initialisation ou quelque chose et maintenant ma tête me fait mal ... Je pense qu'un ApplicationModel est une excellente idée (bien que d'autres ne le fassent évidemment pas, sinon nous l'aurions déjà) et c'est quelque chose que je J'ai réfléchi pour diverses raisons pendant un moment. On dirait que Draco Ater (ci-dessus) a la bonne idée ... – tjmcewan

3

Pour moi, le meilleur moyen sera de l'ajouter dans l'ActiveRecord :: Base dans l'initialiseur. Je crois que le acts_as_reportable est un mixin sous le capot. En faisant cela, vous pourrez appeler toute la méthode fournie avec acts_as_reportable dans tous vos modèles dans l'environnement de développement uniquement. Je vais le faire dans le répertoire config/initializers, dans un fichier appelé model_mixin.rb ou tout ce que vous souhaitez.

class ActiveRecord::Base 
    acts_as_reportable if (ENV['RAILS_ENV'] == "development") 
end 

L'argument de l'utilisation du patch de singe est sale dépend de vous et comment le code lisible est, à mon avis, utiliser ce que vous êtes à l'aise avec. La fonctionnalité est là pour être utilisée et cela dépend toujours de l'utilisateur.

+0

Cela ressemble à la façon la plus rapide et la plus pratique d'y aller pour le moment. J'ai supposé que je ferais mieux de lire un peu sur pourquoi la réparation de singe est si mauvais d'abord, avant que je m'engage à une vie de misère. – tjmcewan

Questions connexes