2010-06-12 9 views
12

Ich habe eine Klassenmethode in alle meine Modelle gemischt. Die Methode wird aufgerufen, wenn die Modellklasse ausgewertet wird. leider (für mich), scheint dies on-demand zu sein, wann immer das Modell in Entwicklung env benötigt wird. Wie kann Schienen alle Modelle beim Start laden? Ist das überhaupt ratsam?Schienen 3 laden alle Modelle beim Start

class Foo < ActiveRecord::Base 
    include Acl 
    register_acl # i need this to be called for all models at start up 
end 

Im Grunde nimmt das Register_acl einige Argumente von "Aktionen", die das Modell gerne zugriffskontrolliert hätte. Angenommen, eine der Aktionen von Foo ist "verwalten" und das System muss diese Aktion beim Start beachten. Ich denke, in dem Modell ist der natürlichste Ort, um diese Logik zu haben.

danke!

Antwort

18

Der richtige Weg, dies applikationsweit zu tun ist, auf cache_classes in Ihrer Konfiguration zu drehen. Standardmäßig ist es in der Entwicklung, aber in der Produktion deaktiviert.

Wenn Sie es sporadisch tun:

Rails.application.eager_load! 
+1

cache_classes ist in der Entwicklung sehr unbequem. Ich werde die eaglar_load-Methode ausprobieren! Vielen Dank! – janechii

0

In MVC-Konzepten sind Modelle nicht dazu gedacht, selbständig zu handeln, d. H. Sie sollten nur dann aktiv werden, wenn der Controller ihnen eine Nachricht sendet (z. B. @ foo.register_acl). Modellinstanzen sollten sogar nicht existieren, bis sie vom Controller erstellt werden.

Was möchten Sie mit Ihrer register_acl-Methode erreichen?

Wenn Sie wirklich etwas brauchen, um bei der Objekt-Erstellung ausgeführt zu werden, können Sie die initialize() -Methode verwenden, die jedes Mal aufgerufen wird, wenn ein Ruby-Objekt erstellt wird.

Allerdings, wenn Sie ein Modell benötigen, um Code selbst auszuführen, stehen Sie wahrscheinlich einem gewissen Code-Geruch gegenüber und Sie müssen etwas in Ihrer App ändern.

+0

Vielen Dank für die Antwort! Ich habe meine Frage aktualisiert, um Sie wissen zu lassen, was ich versuche zu tun. Ich versuche nicht, Instanzen des Modells zu erstellen/zu erhalten. Ich brauche nur die Modelldatei, die beim Start von Rails geladen und ausgewertet wird. In einem regulären Ruby-Programm können Sie erwarten, dass der Klassencode beim Start ausgewertet wird. Danke! – janechii

6

Ich weiß nicht, ob das ideal ist, aber es funktioniert für mich. Irgendwo in der config/initialisieren /, ich tue dies:

Dir.glob("#{Rails.root}/app/models/*.rb").sort.each { |file| require_dependency file } 

und dass preloads meine Modelle

+0

Dadurch werden beispielsweise verschachtelte Modelle oder Modelle innerhalb eingehängter Engines nicht geladen. Der bessere Ansatz lautet 'Rails.application.ager_load!', Wie in der vorherigen Antwort vorgeschlagen. – dzajic

+0

Vielen Dank, dass Sie darauf hingewiesen haben, @dzajic. Es war für immer, aber es ist an der Zeit, dass die Antwort zur besseren Lösung geändert wird! – janechii

Verwandte Themen