2009/10/3 Nelson Fernandez <[email protected]> > 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, lo que estoy intentando hacer, como vos dijiste, es extender el objeto que implementa Class y poder hacer
ActiveRecord::Base.test o MyModelo.test pero no se porque no me funciona. Gracias
_______________________________________________ Ruby mailing list [email protected] http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
