Gibt es eine Möglichkeit, eine Sammlung aller Modelle in Ihrer Rails App zu erhalten?
Gibt es eine Möglichkeit, dass können Sie erhalten eine Auflistung aller Modelle in Ihrer Rails-app?
Im Grunde genommen, kann ich das gerne: -
Models.each do |model|
puts model.class.name
end
Kommentar zu dem Problem
Wenn Sie brauchen, um zu sammeln alle Modelle, einschließlich Modelle von Schienen-Motoren/railties, siehe die Antwort von @jaime
Funktioniert nicht auf Schienen 5.1
InformationsquelleAutor der Frage mr_urf | 2009-02-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Blick auf die Kommentare, und andere Antworten. Es gibt intelligentere Antworten als diesen! Oder versuchen zu verbessern, das man als " community-wiki.
Modelle nicht registrieren Sie sich für ein master-Objekt, also Nein, Schienen nicht die Liste der Modelle.
Aber Sie konnten sehen immer noch in der content-Modelle-Verzeichnis Ihrer Anwendung...
EDIT: eine Andere (wilde) Idee wäre die Verwendung von Ruby-Reflexion, um die Suche für alle Klassen, die erweitert ActiveRecord::Base. Weiß nicht, wie Sie eine Liste aller Klassen, obwohl...
EDIT: Nur so zum Spaß, ich fand einen Weg, um eine Liste aller Klassen
EDIT: es gelang Schließlich in der Auflistung aller Modelle ohne Blick auf Verzeichnisse
Wenn Sie behandeln möchten abgeleiteten Klasse zu, dann müssen Sie prüfen, ob der gesamte Oberklasse-Kette. Ich habe es durch hinzufügen einer Methode der Klasse:
InformationsquelleAutor der Antwort
Die ganze Antwort für Schienen 3, 4 und 5:
Wenn
cache_classes
ausgeschaltet ist (standardmäßig ist es ausgeschaltet in der Entwicklung, aber in der Produktion):Dann:
Dies stellt sicher, dass alle Modelle in Ihrer Anwendung, unabhängig davon, wo Sie sind, sind geladen, und alle Edelsteine, die Sie verwenden, die Modelle sind auch geladen.
Diese sollte auch auf Klassen, die Erben von
ActiveRecord::Base
wieApplicationRecord
im Schienen 5 und wieder nur, dass die Teilstruktur der Nachkommen:Wenn Sie wissen möchten, mehr über wie dies geschieht, überprüfen Sie heraus ActiveSupport::DescendantsTracker.
InformationsquelleAutor der Antwort sj26
Nur falls jemand stolpert auf diesen einen, ich habe eine andere Lösung, nicht abhängig von dir zu Lesen oder die Erweiterung der Klasse class...
Dies liefert ein array von Klassen. So können Sie dann tun
InformationsquelleAutor der Antwort kikito
zurück
Zusätzliche Informationen Wenn Sie möchten, rufen Sie eine Methode auf dem Objekt-Namen ohne Modell:string unbekannten Methode oder variable Fehler verwenden Sie diese
InformationsquelleAutor der Antwort lightyrs
Suchte ich nach Möglichkeiten, dies zu tun und beendete die Wahl auf diese Weise:
Quelle: http://portfo.li/rails/348561-how-can-one-list-all-database-tables-from-one-project
InformationsquelleAutor der Antwort jaime
Ich denke, @hnovick die Lösung ist eine Coole, wenn man keinen Tisch-weniger Modelle. Diese Lösung würde die Arbeit im development-Modus als auch
Mein Ansatz ist etwas anders, obwohl -
klassifizieren ist gut soll geben Sie den Namen der Klasse aus einem string richtig. safe_constantize sorgt dafür, dass Sie es drehen kann, in einer Klasse sicher, ohne eine Ausnahme zu werfen. Dies ist erforderlich, im Falle Sie haben Datenbank-Tabellen, die sind nicht Modelle. kompakt, so dass jede nils in der Aufzählung entfernt werden.
InformationsquelleAutor der Antwort Aditya Sanghi
Wenn Sie wollen einfach nur die Klasse Namen:
Nur führen Sie es in der Rails-Konsole, nichts mehr. Viel Glück!
EDIT: @sj26 ist richtig, Sie müssen führen Sie diese zuerst, bevor Sie anrufen können Nachkommen:
InformationsquelleAutor der Antwort Jordan Michael Rushing
Dies scheint für mich arbeiten:
Schienen nur eine Menge von Modellen, wenn Sie verwendet werden, so Dir.glob-line "muss" alle Dateien im models-Verzeichnis.
Sobald Sie die Modelle in einer Reihe, Sie können tun, was Sie waren zu denken (z.B. in anzeigen-code):
InformationsquelleAutor der Antwort bhousel
Für Rails5 Modelle jetzt sind Unterklassen von
ApplicationRecord
so zu bekommen, Liste aller Modelle in Ihrer app können Sie tun:Oder kürzer:
Wenn Sie im dev-Modus, werden Sie brauchen, um eifrig laden Modelle vor:
InformationsquelleAutor der Antwort Nimir
In einer Zeile:
Dir['app/models/\*.rb'].map {|f| File.basename(f, '.*').camelize.constantize }
InformationsquelleAutor der Antwort vjt
In nur einer Zeile:
InformationsquelleAutor der Antwort Adrian
ActiveRecord::Base.connection.tables
InformationsquelleAutor der Antwort Lumbee
Kann ich nicht kommentieren, aber ich denke, sj26 Antwort sollte die Obere Antwort. Nur ein Tip:
InformationsquelleAutor der Antwort panteo
Dies funktioniert für Schienen 3.2.18
InformationsquelleAutor der Antwort ryan0
InformationsquelleAutor der Antwort Naveed
Zu vermeiden, pre-load alle Schienen, können Sie dies tun:
require_dependency(f) ist die gleiche, die
Rails.application.eager_load!
verwendet. Dies sollte vermeiden, die bereits erforderliche Datei Fehler.Dann können Sie alle Arten von Lösungen zur Liste der AR-Modelle, wie
ActiveRecord::Base.descendants
InformationsquelleAutor der Antwort John Owen Chile
Hier ist eine Lösung, die wurde geprüft einer komplexen Rails-app (die man einschalten Quadrat)
Es nimmt die besten Teile der Antworten in diesem thread und kombiniert Sie in der einfachste und gründlichste Lösung. Diese Fälle behandeln, wo Sie Ihre Modelle sind in Unterverzeichnissen, verwenden Sie set_table_name etc.
InformationsquelleAutor der Antwort Pascal-Louis Perez
Kam gerade über diese, wie ich brauche, um alle Drucker-Modelle mit Ihren Parametern(gebaut auf @Aditya Sanghi Kommentar):
InformationsquelleAutor der Antwort gouravtiwari21
Dieser arbeitete für mich. Besonderen Dank an alle der oben genannten Beiträge. Diese zurückgeben sollte eine Sammlung aller Modelle.
InformationsquelleAutor der Antwort Kevin
Den
Rails
implementiert die Methodedescendants
, aber Modelle nicht unbedingt immer erbt vonActiveRecord::Base
zum Beispiel, der Klasse, beinhaltet das ModulActiveModel::Model
wird das gleiche Verhalten wie ein Modell, einfach nicht wird mit einer Tabelle verknüpft.Also ergänzen, was sagt die Kollegen oben, die geringste Mühe dies zu tun wäre:
Monkey Patch der Klasse
Class
des Ruby:und die Methode
models
, einschließlich der Vorfahren, als diese:Die Methode
Module.constants
gibt (oberflächlich) eine Sammlung vonsymbols
anstelle von Konstanten, also, die MethodeArray#select
ausgetauscht werden können, wie dieses monkey patch derModule
:Monkey patch von
String
.Und, schließlich, die Modelle Methode
InformationsquelleAutor der Antwort rplaurindo
Ja, es gibt viele Möglichkeiten, finden Sie alle Modell-Namen, aber was ich in meiner gem model_info ist , wird es geben Ihnen alle Modelle auch enthalten in der gems.
dann drucken Sie einfach diese
InformationsquelleAutor der Antwort nitanshu verma
InformationsquelleAutor der Antwort Abdul
Ich habe versucht, so viele dieser Antworten erfolglos in Schienen 4 (wow, Sie verändert, eine Sache oder zwei für Gottes Willen) habe ich beschlossen, mein eigenes. Diejenigen, die genannt ActiveRecord::Base.Verbindung und zog die Tabellennamen gearbeitet, aber hat nicht das Ergebnis bekommen, das ich wollte, weil ich versteckt haben einige Modelle (die in einem Ordner innerhalb von app/models/), dass ich nicht löschen möchten:
Ich in einem Initialisierer und können es nennen, von überall. Verhindert unnötige Maus-Nutzung.
InformationsquelleAutor der Antwort boulder_ruby
können dies überprüfen,
InformationsquelleAutor der Antwort Arvind
Vorausgesetzt, alle Modelle sind in app/models und Sie haben, grep & awk, die auf Ihrem server (Mehrzahl der Fälle),
Es schneller als
Rails.application.eager_load!
oder die Schleife durch jede Datei mitDir
.EDIT:
Der Nachteil dieser Methode ist, dass es findet Modelle, die indirekt erbt von ActiveRecord (z.B.
FictionalBook < Book
). Der sicherste Weg istRails.application.eager_load!; ActiveRecord::Base.descendants.map(&:name)
, obwohl es ein bisschen langsam.InformationsquelleAutor der Antwort konyak
Ich bin einfach nur werfen in diesem Beispiel hier, wenn jemand findet es nützlich. Die Lösung basiert auf diese Antwort https://stackoverflow.com/a/10712838/473040.
Lassen Sie sagen, Sie haben eine Spalte
public_uid
verwendet wird als eine primär-ID, um sich mit der Außenwelt (Sie können findjreasons, warum Sie würde wollen, dass hier)Lassen Sie uns jetzt sagen Sie eingeführt haben, dieses Feld auf Haufen von bestehenden Modellen und jetzt wollen Sie regenerieren, werden alle Datensätze, die noch nicht eingestellt sind. Sie können tun, wie diese
nun können Sie
rake di:public_uids:generate
InformationsquelleAutor der Antwort equivalent8