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.
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.
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.
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
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 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.