Por el tema de las columnas desperdiciadas en la tabla (Pescados en este
caso) lo que podes hacer es intentar identificar aquellas que realmente no
necesiten estar 'indexadas' o las cuales no vas a utilizar para realizar
busquedas/aplicar scopes. En caso de encontrar algunas de estas podes
generar una solo columna que almacene estos atributos serializados y generar
algunos metodos del tipo accessor para setear y obtener cada uno de los
datos serializados de manera independiente.

Otra forma es generar un modelo de atributos (algo asi como
pescado_attributes) que respete un esquma de llave-valor donde la llave
seria el nombre del atributo y el valor ¬_¬ el valor del atributo. Este
ultimo acercamiento, mas rebuscado, te va a permitir (si tenes los indices
correctamente creados) realizar busquedas sobre los atributos (un poco mas
costosas para la DB pero busquedas al fin).
La eleccion varia mucho dependiendo de que tan grande reulten ser la
cantidad de subclases y las diferencias que puedan presentar + el tipo de
operaciones que tengas que realizar con las colleciones de estos tipos.

Aprovecho para comentarte que utilizando STI (Single table inheritance) con
ActiveRecord el type es autoseteado si utilizas las subclases directamente.
Ej, Delfin.create(:nombre => 'Flipper', :color => 'Gris', :salta_el_are =>
false, :grita => true) va a terminar almacenando un registro en la DB con
esos parametros y el type == 'Delfin'.

Saludos,
--
Roberto



2011/4/20 Geronimo Diaz <[email protected]>

>  Hola paolo, podrias usar "Single table inheritance" (
> http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html), la
> idea seria definir todos los atributos de todos los subtipos de pescados que
> tuvieras en la misma tabla pescado, mas un atributo llamado type que
> contendra el nombre de la clase del pescado, ejm:
>
> tabla pescados
> id    nombre  color . ...  type
> 1  'delfin',  'gris', .... ,  'Delfin'
> 2  'tiburon',  ......         'Tiburon'
>
> luego tendras un modelo para la clase abstracta y para las
> concretizaciones, Pescado, Delfin, Tiburon. Cuando en una instancia asignes
> el campo type, AR internamente intentara instanciar un objeto del tipo
> definido en ese campo, asi podras hacer cosas como Delfin.all o Tiburon.all.
>
> Hay otras formas de definir el modelo relacional, en lugar de poner todos
> los campos en una misma tabla podrias crear tablas para cada tipo y
> relacionarlas mediantes foreing keys, te dejo una breve descripcion:
>
> http://www.fortunecity.com/lavender/dale/1054/base/extendido.htm (apartado
> 6.1. Relaciones Superclase/Subclase y Especialización/ Generalización.)
>
> espero te sirva de ayuda.
>
> Saludos
>
>
>
>
>
>
>
> On 20/04/11 15:04, Paolo Loran wrote:
>
> Buenos dias, mi consulta esta dirijida a como maneja ActiveRecord a las
> clases Abstractas y el tema de Herencia, ya que no me queda muy claro su
> funcionamiento y uso.
> Ejemplo del Mundo Acuatico :D :
>
> Pescado (nombre, color, tamaño)
>     |--------Delfin (salta_el_aro , grita)
>     |--------Tiburon (dientes)
>
> Por lo que entiendo la clase Pescado seria una clase Abstracta la cual
> tendria definido entre sus atributos a nombre, color y tamaño, y por otro
> lado deberia tener a Delfin como una clase concreta que heredara de Pescado
> (al igual que tiburon).
> En mi "Sistema del Mundo Acuatico" nunca crearia nuevos pescados, pero si
> nuevos delfines y tiburones, sino entiendo mal esto deberia estar reflejado
> en el modelo no es asi?.
> Por otro lado veo que debería tener creada una tabla en mi BD de nombre
> pescado que posea a todos los atributos tanto de Pescado, Delfin y Tiburon,
> no es asi? lo que implicaría tener muchos campos con null, mi pregunta viene
> a eso, es manejaba el desperdicio de espacio en la BD de alguna forma? estoy
> utilizando SQLite3, debería tirarme a una opcion com PostgreSQL? que me
> dicen.
>
> Saludos, atte.
> poli
>
>
> _______________________________________________
> Ruby mailing 
> [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