[Ror-es] #include en ruby

Sebastian Delmont sd at notso.net
Sat Sep 23 01:00:00 GMT 2006


No, ese codigo se ejecuta una sola vez, al momento de cargar "client.rb"

Claro, esta solucion es un poco "sucia".

Como te abras dado cuenta, el problema en Rails es que no puedes  
crear una clase "Persona" de la cual derivar "Cliente" y "Empleado",  
a menos que pienses guardar todos los objetos en una misma tabla  
(usando lo que se conoce como "Single Table Inheritance").

La solucion es emplear modulos.

module PersonCommon
   ...
   def name
     self[:name].capitalize
   end
   ...
end

class Client < ActiveRecord::Base
   include PersonCommon
end

class Employee < ActiveRecord::Base
   include PersonCommon
end


El unico problema con los modulos es que no puedes definir "metodos  
de clase" (algo como Client.find_special). Pero hay una solucion  
bastante comun: Emplear el metodo append_features de la clase Module,  
que es invocado cada vez que un modulo es incluido en otra clase o  
modulo:

module PersonCommon
   module ClassMethods
     def special_find
        ...
     end
   end

   def self.append_features(included_on)
     included_on.extend ClassMethods
   end

   def mas_metodos_de_instancia
      ...
   end
end

De esta manera, ahora puedes hacer Client.find_special, o  
@client.name o Employee.find_special o @employee.name, etc, etc...

Espero que esta breve explicacion sea suficiente para activar tu  
curiosidad :-)



On Sep 22, 2006, at 6:34 PM, Esteban wrote:

> Para mi sorpresa usar herencia no funcionó, en cambio la sugerencia  
> de Sebastian Delmont si, con leves cambios
>
> class Client < ActiveRecord::Base
>     eval(IO.read('app/models/client_common.rb'))
>     ...
> end
>
> Ahora me pregunto si "eval" se está ejecutando cada vez que  
> instancio un objecto de esta clase?
>
>
> Gracias a todos
>
>
> Sebastian Delmont wrote:
>> perdon... eval(File.read(...))
>>
>> On Sep 21, 2006, at 2:27 PM, Juan Lupión wrote:
>>
>>
>>> ¿Has probado a crear una clase ClienteAbstracto que contenga el  
>>> código
>>> común y que herede de ActiveRecord::Base y luego hacer que Cliente y
>>> VClient hereden de ClienteAbstracto?
>>> -- 
>>> ----------------------------------------------------
>>> http://hronia.blogalia.com
>>> _______________________________________________
>>> Ror-es mailing list
>>> Ror-es at lists.simplelogica.net
>>> http://lists.simplelogica.net/mailman/listinfo/ror-es
>>>
>> _______________________________________________
>> Ror-es mailing list
>> Ror-es at lists.simplelogica.net
>> http://lists.simplelogica.net/mailman/listinfo/ror-es
>>
>>
>
> _______________________________________________
> Ror-es mailing list
> Ror-es at lists.simplelogica.net
> http://lists.simplelogica.net/mailman/listinfo/ror-es

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.simplelogica.net/pipermail/ror-es/attachments/20060923/24bb2398/attachment-0001.htm 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2407 bytes
Desc: not available
Url : http://lists.simplelogica.net/pipermail/ror-es/attachments/20060923/24bb2398/attachment-0001.bin 


More information about the Ror-es mailing list