Vas a tener que definir las clases mas o menos asi:

class Pescado < ActiveRecord::Base
end

class Delfin < Pescado
end

Y asegurarte de crear la tabla 'pescados' con las columnas que representen
el conjunto de atrubutos de todas las subclases + una columna 'type' del
tipo String.

Por el tema de la privacidad de los atributos, ej, que salmon no pueda
responder a salta_el_aro pero delfin si tendrias que utilizar
'attr_accessible'

class Pescado < ActiveRecord::Base
  attr_accessible :nombre, :color #Atributos comunes a cualquier subclase de
Pescado
end

class Delfin < Pescado
  attr_accessible :salta_el_aro, :grita #Atributos propios de Delfin
end

class Salmon < Pescado
  attr_accesible :rosado #Atributo propio de Salmon
end

Saludos,
--
Roberto

2011/4/20 Paolo Loran <[email protected]>

> Mil gracias voy a probar todo esto que me dicen.
> Por ejemplo dentro de mi modelo Delfin, voy a saber a simple vista si
> hereda de Pescado? ese seria el type que ustedes me comentan?
>
> paolo
>
>
> 2011/4/20 NeX Development <[email protected]>
>
>> 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
>>
>>
>
> _______________________________________________
> 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