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

Responder a