2010-06-12 19 views
12

Tengo un método de clase mezclado en todos mis modelos. el método se llama cuando se evalúa la clase de modelo. desafortunadamente (para mí), esto parece estar a pedido, siempre que se necesite el modelo en el entorno de desarrollo. ¿Cómo pueden los rieles cargar todos los modelos al inicio? esto es incluso aconsejable?Rails 3 cargando todos los modelos en el arranque

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

Básicamente, el register_acl toma unos argumentos de "acciones" que el modelo le gustaría ser de acceso controlado. Supongamos que una de las acciones de Foo es "administrar" y el sistema debe conocer esta acción al inicio. Creo que en el modelo es el lugar más natural para tener esta lógica.

gracias!

Respuesta

18

La forma correcta de hacer esto-es amplia aplicación para encender cache_classes en su configuración. Por defecto está desactivado en desarrollo pero en producción.

Si desea hacerlo de forma esporádica:

Rails.application.eager_load! 
+1

cache_classes es muy inconveniente en el desarrollo. ¡Probaré el método eaglar_load! ¡Gracias! – janechii

0

En modelos de concepto MVC no están destinados a actuar por sí mismos, es decir, que sólo debe actuar cuando el controlador les envía un mensaje (por ejemplo, @ foo.register_acl). Las instancias de modelo incluso no deberían existir hasta que sean creadas por el controlador.

¿Qué intenta lograr con su método register_acl?

Si realmente necesita algo para ser ejecutado en la creación de objetos se puede utilizar inicializar() método que se llama cada vez que se crea un objeto Ruby.

Sin embargo si necesita modelo para ejecutar algún código por sí mismo es muy probable que se enfrentan algunos olor de código y necesita cambiar algo dentro de su aplicación.

+0

Gracias por la respuesta! He actualizado mi pregunta para que sepa lo que estoy tratando de hacer. No estoy tratando de crear/obtener instancias del modelo. Solo necesito que el archivo de modelo sea cargado y evaluado por Rails al inicio. En un programa de ruby ​​regular, puede esperar que el código de clase se evalúe al inicio. Gracias! – janechii

6

No sé si esto es ideal, pero me sirve. En algún lugar de la config/inicializar /, hago esto:

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

y que precargas mis modelos

+0

Esto no cargará modelos anidados o modelos dentro de motores montados, por ejemplo. El mejor enfoque es llamar a 'Rails.application.eager_load!', Como sugirió la respuesta anterior. – dzajic

+0

Gracias por señalar eso, @dzajic. Ha sido una eternidad, ¡pero ya es hora de que la respuesta cambie a la mejor solución! – janechii

Cuestiones relacionadas