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
