217 votes

Est-il possible d’obtenir une collection de tous les modèles dans votre application Rails ?

Est-il possible que vous pouvez obtenir une collection de tous les modèles dans votre application Rails ?

Fondamentalement, je peux faire des gens comme :-

Merci d’avance.

419voto

sj26 Points 2455

L'ensemble de la réponse pour Rails 3 et 4 est la suivante:

Si cache_classes est désactivé (par défaut il est désactivé dans le développement, mais en production):

Rails.application.eager_load!

Alors:

ActiveRecord::Base.descendants

Cela permet de s'assurer tous les modèles dans votre application, peu importe où ils sont, sont chargés, et toutes les gemmes que vous utilisez qui fournissent des modèles sont également chargés.

Si vous souhaitez en savoir plus sur la façon dont cela est fait, découvrez ActiveSupport::DescendantsTracker.

119voto

kikito Points 23229

Juste au cas où quelqu'un tombe par hasard sur ce coup, j’ai une autre solution, ne pas se fier sur dir lecture ou l’extension de la classe de la classe...

Cela retournera un tableau des classes. Ainsi, vous pouvez faire

101voto

Vincent Robert Points 16530

EDIT: Regardez les commentaires et les autres réponses. Il y a de plus intelligent des réponses que celui-ci! Ou essayer d'améliorer ce que wiki de la communauté.

Les modèles à ne pas s'inscrire à un master de l'objet, de sorte qu'aucun, Rails de ne pas avoir la liste des modèles.

Mais vous pouvez toujours regarder dans le contenu du répertoire des modèles de votre application...

Dir.foreach("#{RAILS_ROOT}/app/models") do |model_path|
  # ...
end

EDIT: Autre (sauvages) idée serait d'utiliser Ruby réflexion à la recherche de toutes les classes qui s'étend ActiveRecord::Base. Ne sais pas comment vous pouvez lister toutes les classes...

EDIT: Juste pour le fun, j'ai trouvé un moyen de la liste de toutes les classes

Module.constants.select { |c| (eval c).is_a? Class }

EDIT: Finalement réussi à lister tous les modèles sans regarder les répertoires

Module.constants.select do |constant_name|
  constant = eval constant_name
  if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
    constant
  end
end

Si vous souhaitez gérer la classe dérivée de trop, alors vous aurez besoin de tester l'ensemble de la superclasse de la chaîne. Je l'ai fait par l'ajout d'une méthode à la Classe de la classe:

class Class
  def extend?(klass)
    not superclass.nil? and ( superclass == klass or superclass.extend? klass )
  end
end

def models 
  Module.constants.select do |constant_name|
    constant = eval constant_name
    if not constant.nil? and constant.is_a? Class and constant.extend? ActiveRecord::Base
    constant
    end
  end
end

69voto

lightyrs Points 911
<pre><code></code><p>sera de retour</p><pre><code></code></pre></pre>

34voto

jaime Points 528

J’ai cherché des moyens de le faire et fini par choisir cette voie :

Source : http://portfo.li/rails/348561-how-can-one-list-all-database-tables-from-one-project

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X