Listado de todos los modelos de mi aplica ción Rails

Hola gente,

Busco la manera en que se pueda listar (en forma de Array o lo que
sea) todos los ActiveRecord (o sus nombres en String) de mi
aplicaciónRails.

Busco esto para poder hacer un:
Modelo1.delete(:all)
Modelo2.delete(:all)
Modelo3.delete(:all)

Si por lo menos tengo los nombres igual con reflection puedo hacerlo.

He llegado hasta
aquí:
?> sql = ActiveRecord::Base.connection()

result = sql.execute “select table_name from information_schema.Tables where table_schema = ‘confror’”
result.each {|r| puts r[0]}
tabla1
tabla2
tabla3

Podría con esto intentar hacer ‘capitalize’ o algo… pero pregunto
primero en vez de empezar a liarme por donde no es.

Cualquier sugerencia es bienvenida.

Saludos
f.

Fernando,

te sirve un Dir.glob("#{RAILS_ROOT}/app/models/*.rb") ?
Te devuelve un array con los nombres de los ficheros que tienes en app/
models, luego los puedes tratar del estilo:

Dir.glob("#{RAILS_ROOT}/app/models/*.rb").each {|file| file.gsub(/.rb
$/,’’).constantize.delete_all }

Aprox…

Salutaciones,

Isaac Feliu

On Tue, Sep 23, 2008 at 7:00 PM, Isaac Feliu Pérez
[email protected] wrote:

Dir.glob(“#{RAILS_ROOT}/app/models/*.rb”).each {|file| file.gsub(/.rb
$/,‘’).constantize.delete_all }

Y si los modelos no son ActiveRecord?

2008/9/23 Francesc E. [email protected]:

On Tue, Sep 23, 2008 at 7:00 PM, Isaac Feliu Pérez
[email protected] wrote:

Dir.glob(“#{RAILS_ROOT}/app/models/*.rb”).each {|file| file.gsub(/.rb
$/,‘’).constantize.delete_all }

Y si los modelos no son ActiveRecord?

Son ActiveRecord … :)… por no buscar una solución demasiado generalista.

Dir[“#{RAILS_ROOT}/app/models/**/*.rb”].each do |m|
class_name = m.sub(/.rb$/,‘’).camelize
klass = class_name.split(‘::’).inject(Object){ |klass,part|
klass.const_get(part) }
self.delete_all if klass < ActiveRecord::Base &&
!klass.abstract_class?
end

Lo dejo en un Gist 12343’s gists · GitHub

On Tue, Sep 23, 2008 at 7:05 PM, Fernando G.

2008/9/23 Isaac Feliu Pérez [email protected]:

Fernando,

te sirve un Dir.glob(“#{RAILS_ROOT}/app/models/*.rb”) ?
Te devuelve un array con los nombres de los ficheros que tienes en app/
models, luego los puedes tratar del estilo:

Dir.glob(“#{RAILS_ROOT}/app/models/*.rb”).each {|file| file.gsub(/.rb
$/,‘’).constantize.delete_all }

Buena aproximación :slight_smile:

f.

Hola,

Busco la manera en que se pueda listar (en forma de Array o lo que
sea) todos los ActiveRecord (o sus nombres en String) de mi aplicación
Rails.

Yo tengo esto en un proyecto donde necesito precargar los modelos porque
los guardo en memcached y si no al deserializar me puede dar problemas

ActiveRecord::Base.connection.tables.each do |model|
begin
“#{model.classify}”.constantize
rescue Exception
nil
end
end

Sólo te funcionará en el caso de que tus modelos sigan las convenciones
de nomenclatura. Además, si tienes varios modelos hijos que extiendan de
un mismo modelo padre y compartan esa tabla, los hijos tampoco te los
cargará. Como entiendo que no tienes ninguno de los dos, con eso te
debería servir.

En caso de que tuvieses modelos con nomenclatura no estándar, podrías
hacer un ls de los ficheros dentro de app/models y convertir los nombres
de ficheros a constantes. El problema de ese enfoque es que los modelos
que vengan de plugins, o que estén en subcarpetas, no te los
reconocerá.
suerte,

j


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez

2008/9/23 Francesc E. [email protected]:

Dir[“#{RAILS_ROOT}/app/models/**/*.rb”].each do |m|
class_name = m.sub(/.rb$/,‘’).camelize
klass = class_name.split(‘::’).inject(Object){ |klass,part|
klass.const_get(part) }
self.delete_all if klass < ActiveRecord::Base && !klass.abstract_class?
end

Madre mía la que has montado aquí :slight_smile:

Lo dejo en un Gist 12343’s gists · GitHub

Mola esto de gist… no lo conocía.

f.

El día 23 de septiembre de 2008 19:03, javier ramirez
[email protected]
escribió:> begin

 "#{model.classify}".constantize
 rescue Exception
   nil
 end

end

funciona :slight_smile:

On Tue, Sep 23, 2008 at 7:15 PM, Fernando G.
[email protected] wrote:

Madre mía la que has montado aquí :slight_smile:

Tu no querias los modelos? Quizas es una paja mental, pero es la
manera de saber que modelos son AR.

He actualizado el Gist 12343’s gists · GitHub

No es culpa de ni de 1.2.3 ni de 2.0.1 ni de nada relacionado con
Ruby. Me he colado.
:confused:

Ahora si … 12343’s gists · GitHub

2008/9/23 Francesc E. [email protected]:

Dir[“#{RAILS_ROOT}/app/models/**/*.rb”].each do |m|
class_name = m.sub(/.rb$/,‘’).camelize
klass = class_name.split(‘::’).inject(Object){ |klass,part|
klass.const_get(part) }
self.delete_all if klass < ActiveRecord::Base && !klass.abstract_class?
end

Me da este error en RAILS 1.2.3:

NameError: uninitialized constant Script


?> Dir[“#{RAILS_ROOT}/app/models/**/*.rb”].each do |m|
?> class_name = m.sub(/.rb$/,‘’).camelize

klass = class_name.split(‘::’).inject(Object){ |klass,part| klass.const_get(part) }
self.find(:all) if klass < ActiveRecord::Base && !klass.abstract_class?
end
NameError: uninitialized constant Script
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/…/…/activesupport/lib/active_support/dependencies.rb:266:in
load_missing_constant' from ./script/../config/../config/../vendor/rails/activerecord/lib/../../activesupport/lib/active_support/dependencies.rb:452:in const_missing’
from
./script/…/config/…/config/…/vendor/rails/activerecord/lib/…/…/activesupport/lib/active_support/dependencies.rb:464:in
const_missing' from (irb):69:in const_get’
from (irb):69
from (irb):71:in inject' from (irb):69:in each’
from (irb):69:in inject' from (irb):69 from (irb):67:in each’
from (irb):67


Y este en Rails 2.0.1 Aunque igual no es cosa de la versión sino de
los modelos de cada proyecto:


?> Dir[“#{RAILS_ROOT}/app/models/**/*.rb”].each do |m|
?> class_name = m.sub(/.rb$/,‘’).camelize

klass = class_name.split(‘::’).inject(Object){ |klass,part| klass.const_get(part) }
self.find(:all) if klass < ActiveRecord::Base && !klass.abstract_class?
end
ArgumentError: interning empty string
from (irb):9:in const_get' from (irb):9 from (irb):11:in inject’
from (irb):9:in each' from (irb):9:in inject’
from (irb):9
from (irb):7:in `each’
from (irb):7
from :0


En cualquier caso no te vuelvas loco… la solución de javier ramirez
me parece limpia y funa bien.

Gracias.
f.

El día 23 de septiembre de 2008 23:30, Guillermo
[email protected]
escribió:> AR guarda la clase cada vez que se hereda de de AR::Base como puedes ver

aquí.
http://github.com/rails/rails/tree/master/activerecord/lib/active_record/base.rb#L397
Sin tener mucha idea, podrías usar ese @@subclases.

Masié para
mí:>> ActiveRecord::Base@@subclases
NameError: uninitialized class variable @@subclases in Object
from (irb):3

ActiveRecord::Base.send(“@@subclases”)
NoMethodError: undefined method @@subclases' for ActiveRecord::Base:Class from ./script/../config/../config/../vendor/rails/activerecord/lib/active_record/base.rb:1235:in method_missing’
from (irb):4:in `send’
from (irb):4

:slight_smile:

Sin embargo, no te es más fácil borrar todas las tablas

Quería borrarlas usando ActiveRecord

, y hacer un
rake:db:schema:load

Esta es buena también gracias.

Graaacias… te debo un fortuna :slight_smile:

f.

On 23 Sep 2008, at 23:40, Fernando G. wrote:

Masié para mí:

ActiveRecord::Base@@subclases
NameError: uninitialized class variable @@subclases in Object
from (irb):3

ActiveRecord::Base.send("@@subclases")

ActiveRecord::Base.send(:subclasses)

Pero eso solo te va a dar los modelos que ya estan cargados (AR usa
lazy loading…)

Quería borrarlas usando ActiveRecord

ActiveRecord::Base.connection.tables

…te da la lista de tablas.

De aqui se puede ir borrando.

-christos

Genial… gracias por la catarata de ideas.

Saludos
f.

AR guarda la clase cada vez que se hereda de de AR::Base como puedes ver
aquí.

Sin tener mucha idea, podrías usar ese @@subclases.

Sin embargo, no te es más fácil borrar todas las tablas, y hacer un
rake:db:schema:load