Primero que nada: acaban de morir varios gatitos inocentes por la
atrocidad esa de nombrar clases Pescado y Delfín, en lugar de Fish y
Dolphin. Ruby está en inglés, así que a menos que escribas "si
condición; <código>; fin" (que no conozco ningún interprete de ruby
que te deje), el código deberías escribirlo de forma consistente :)

Segundo, el Deflín no es un pescado, es un mamífero ¬¬

Ahora, hablando en serio: ruby no es java/c#/c++/el lenguaje OOP que
te guste y con el que estés familiarizado. No tiene clases abstractas.
Sí, hay algunos hacks que podés hacer para que "parezcan" abstractas,
pero siguen sin serlo. Y son el tipo de hacks por los cuales yo
despediría gente (afortunadamente, no tengo a nadie a mi cargo para
despedir, sino con lo quisquilloso que soy estaría más sólo que el uno
:P).

La forma "ActiveRecordense" de hacer lo que querés es usar Single
Table Inheritance, como ya te lo han recomendado. Definís una clase
Fish (:P), y de ella heredan Shark, Goldfish, Tuna, y todos los
pescados que quieras. En tus controllers, vos manejás las subclases, y
no tocás la clase padre (a menos que quieras crear algo genérico, o
usarlo tipo Factory para crear objetos de acuerdo al input de un
usuario—por ejemplo, el usuario en un <select> elige qué clase de
pescado pescó hoy, y vos creás el adecuado en la base).

Listo, no hay "abstract classes", no hay "final classes", y no hay
métodos "protected" en ruby (ni privados, pero bueno, eso es para otro
thread). No traten de hacer magia para hacer que ruby se parezca a
<inserte lenguaje de programación aquí>

Abrazo,
-foca

2011/4/20 Paolo Loran <[email protected]>:
> Mil gracias, ahora me quedo todo mas claro.
> Lo voy a probar y cualquier cosa que me frene, les consulto.
>
> Saludos.
> poli
>
> 2011/4/20 Lucas Tolchinsky <[email protected]>
>>
>> En el ejemplo de Roberto, cuando vos hacés Delfin.create, estarías creando
>> un registro en la tabla Pescados cuyo type sería 'Delfin'. En resúmen, vos
>> sólo tenés una tabla, Pescados con una columna type que indica a qué clase
>> concreta pertenece. El esquema sería:
>> class Pescado < ActiveRecord::Base
>> class Delfin < Pescado
>> Adjunto de paso un link sobre cómo implementar clases abstractas en ruby
>> http://stackoverflow.com/questions/512466/how-to-implement-an-abstract-class-in-ruby
>>
>> Saludos!
>> Tonchis
>>
>> PD: el delfín es un mamífero :D
>>
>> _______________________________________________
>> 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
>
>
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a