2010-07-30 14 views
5

sé que se puede hacer algo como esto para cargar el ambiente carriles:Tareas ActiveRecord Migration & Rake no cargando modelos?

task :my_task => :environment do 
    MyModel.find(1) 
    end 

pero parece que el código en los modelos no se ejecutan. Estoy usando acts_as_audited, y hay una buena función de clase que recupera todos los modelos que están siendo auditados. La llamada se ve algo como:

Audit.audited_classes 

Y para especificar un modelo de ser auditable, sólo tiene que añadir esta línea a sus modelos:

acts_as_audited 

Cuando audited_classes se ejecuta en la consola, consigo una serie de todas mis clases auditadas; sin embargo, cuando lo ejecuto desde una tarea de rake (o migración), obtengo una matriz vacía.

[EDIT]

Después de jugar un poco más, se dio cuenta que si los modelos no se carguen hasta que se hace referencia (es decir, la carga diferida). Pensé que establecer cache_classes en true en la configuración solucionaría esto, pero todavía parecen estar cargados de forma lenta.

Una posible solución sería recorrer todos los modelos (como se explica en esta publicación: Is there a way to get a collection of all the Models in your Rails app?) pero parece un poco raro, y esperaba que hubiera una manera más limpia.

¿Alguna idea?

Gracias

Respuesta

1

Puede añadir config/ambientes/development.rb:

Dir[Rails.root.join('app', 'models', '**/*')].each { |file| File.basename(file, '.rb').camelize.constantize } 
+0

Sí ... yo ya estaba haciendo eso, pero es un truco ... Yo presenté un boleto aquí: https://github.com/rails/rails/issues/5148 – gmoniey

+0

esto no funciona con modelos de espacio de nombres, no creo. ¿Alguna vez te has encontrado con un espacio de uso con espacios de nombres? – jay

1

Esto sucede cuando se tiene config.threadsafe! en entornos de producción, que establece automáticamente config.dependency_loading = false. Esto evita que los rieles carguen sus clases modelo durante las tareas de rake.

La forma de evitar esto es establecer "config.dependency_loading = true if $ rails_rake_task" en su archivo de entorno. Por ejemplo, en mi production.rb tengo:

config.threadsafe! 
config.dependency_loading = true if $rails_rake_task 

o también puedo hacer

config.threadsafe! unless $rails_rake_task 
Cuestiones relacionadas