2009/10/3 Martin Aceto <[email protected]> > 2009/10/3 Nelson Fernandez <[email protected]> > > Martin ! >> >> 2009/10/2 Martin Aceto <[email protected]> >> >>> Hola, como estan >>> >>> >>> estoy tratando de extender activerecord para poder sacar de un modelo >>> logica que no pertenece a ese modelo sino que engloba varios modelos, logica >>> de negocio bastante complicada que desearia separar. >>> >>> Me encuentro con la pregunta de cual es la forma correcta de hacerlo ? >>> >>> Lo que pense fue crear un archivo en /lib y dentro definir esos metodos >>> que necesito, este ejemplo de abajo es correcto ? o estoy equivocado en mi >>> concepto ? >>> >>> module Test >>> module ClassMethods >>> def test >>> puts "Test" >>> end >>> end >>> end >>> >>> ActiveRecord::Base.send(:extend, Test::ClassMethods) >>> >>> >> >> Comparto con Emanuel de usar la menos magia posible .. quizás otra >> solución simple sea usar mixins [1] ?. >> >> [1] http://www.rubycentral.com/pickaxe/tut_modules.html#S2 >> >> >> -- >> :: nelson :: >> [ artesano de software & software craftsman ] >> http://netflux.com.ar >> >> >> >> > Leí el enlace que mandaste Nelson, si es mas simple, esta bueno. Pero > quiero extender ActiveRecord para poder tener esos metodos en todas las > clases, estoy intentando hacer esto como dijo Emmanuel > > module Test > > module ClassMethods > > def test > puts "Test" > end > > end > > end > > ActiveRecord::Base.extend, Test::ClassMethods > ActiveRecord::Base.class_eval do > include Test::InstanceMethods > end > > pero no me funciona, y no entiendo porque, pero si incluyo directamente en > una clase de esta manera > >
"extend" es para agregar los métodos de un modulo a una "instancia", no a una clase. Lo que está haciendo "ActiveRecord::Base.extend Test::ClassMethods" es extender el objeto que implementa Class... en el caso práctico estás agregando métodos de clase, es decir que lo que va a funcionar es ActiveRecord::Base.test o MyModelo.test que no es lo que estas buscando, creo... sino que las instancias de ActiveRecord tengan tus nuevos métodos. Para mí la forma más simple y clara nuevamente es usar mixins y de esa forma queda muy claro que modelos van a tener esa funcionalidad agregada. PD: Te recomiendo ver este video donde Dave Thomas explica el modelo de objetos de Ruby http://scotland-on-rails.s3.amazonaws.com/2A04_DaveThomas-SOR.mp4 y este muy gracioso cuando Joe OBrian quiere usar metaprograming a toda costa ;) http://scotland-on-rails.s3.amazonaws.com/2A08_JoeOBrianJimWeirich-SOR.mp4 -- :: nelson :: [ artesano de software & software craftsman ] http://netflux.com.ar > module Test > > module ClassMethods > > def test > puts "Test" > end > > end > > end > > > class User < ActiveRecord::Base > include Test::InstanceMethods > extend Test::ClassMethods > end > > funciona bien y tengo los metodos en la clase. > > Que estoy haciendo mal para que el primer ejemplo no funcione ? alguna idea > ? > > Si sirve de algo es un app en Rails 2.3.2, el archivo esta en lib/test.rb > > Martin > > _______________________________________________ > Ruby mailing list > [email protected] > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar > >
_______________________________________________ Ruby mailing list [email protected] http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
