2010-07-14 15 views
11

Rails no carga el modelo bajo demanda. Para una tarea de rake que estoy escribiendo, necesito poder iterar sobre todas las instancias de ActiveRecord::Base (que es posible con ActiveRecord::Base.send(:subclasses)).¿Cómo puedo forzar a Rails a cargar todos los modelos?

Sin embargo, para que lo anterior funcione, tienen que estar cargados. Alguien sabe de una forma de forzar a todos los modelos a cargar? Idealmente, me gustaría no tener que meterme en app/models ya que me gustaría encontrar modelos agregados por complementos también.

Respuesta

12

carriles 2:

Dir[Pathname(RAILS_ROOT) + 'app/models/**/*.rb'].each do |path| 
    require path 
end 

carriles 3:

Dir[Rails.root + 'app/models/**/*.rb'].each do |path| 
    require path 
end 

de otra manera:

(ActiveRecord::Base.connection.tables - %w[schema_migrations]).each do |table| 
    table.classify.constantize rescue nil 
end 
+1

Problema con eso es que, como se señala en la pregunta, no se detectarán los modelos agregados por los complementos. En términos concretos, uno de los casos importantes para el complemento que estoy escribiendo es una tienda de Spree, donde básicamente ninguno de los modelos está en 'app/models' – scotchi

+0

Simplemente agregue' **/'al comienzo de glob =>' Dir [Rails.root + '**/app/models/**/*. Rb'] ' – tig

+0

Sin embargo, ¿por qué necesita revisar todos los modelos? – tig

26

necesitaba todos los modelos cargados para una tarea rake que comprueba la validez de todos los registros , y encontró el práctico método eager_load, que se puede usar simplemente así:

Rails.application.eager_load!

+5

Realmente prefiero esta respuesta a los demás. Es una forma mucho más limpia de hacer las cosas en mi opinión. – taelor

Cuestiones relacionadas