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

Responder a