2009/10/2 Emmanuel Oga <[email protected]>
> 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)
>
> Esta bien. Lo que podes sacar es el send. En general, send se usa
> cuando no sabes con anticipación cual es el mensaje que le vas a
> mandar a un objeto (si lo estas usando para mandarle al objeto
> mensajes que son privados, no lo hagas :-).
>
> ActiveRecord::Base.extend, Test::ClassMethods
> ActiveRecord::Base.class_eval do
> include Test::InstanceMethods
> end
>
> Si tu lógica de negocios es muy especifica quizás quieras incluir
> explícitamente en cada clase lo que corresponda y listo
>
> class User < ActiveRecord::Base
> include Test::InstanceMethods
> extend Test::ClassMethods
> end
>
> Seguro alguno te va a comentar del hook "included" para cuando quieras
> extender y a la vez incluir (metodos de clase/instancia)
>
> module Test
> def self.included(klass)
> klass.extend Test::ClassMethods
> end
>
> module ClassMethods
> def algo
> end
> end
> end
>
> Sirve, pero, no se... Me parece mas simple y explicito hacer el extend
> a mano y listo, cualquiera que lo ve nota que estas agregando métodos
> de clase o instancia. Cuanto menos magia, mejor.
>
>
>
Gracias Emmanuel por tu respuesta,
estos metodos necesito que se utilicen en un par de clases no en alguna en
particular como el ejemplo que diste de User, creo que haciendolo así va
andar bien.
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
muy buena tu respuesta, muchas gracias de nuevo
Martin
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar