2010/7/31 Aureliano Calvo <[email protected]> > > >> Hola otra vez lista! >>> >>> Disculpes mis molestias :-P >>> >>> Quería ver si a alguno se le ocurre una manera mejor de resolver lo >>> siguiente: >>> >>> Cuál es la mejor manera de unir en una misma tabla elementos de varios >>> modelos? >>> >>> Por ahora lo resolví "sumando" las diferentes asociaciones con un map{} >>> que arma hashes igual.es >>> >>> class Person << ActiveRecord::Base >>> >>> >>> >>> >>> >>> >>> ... >>> def dashboard >>> ds = self.interviews.all.map{|i| {:when => i.when, :observations => >>> i.obs}} + >>> >>> >>> >>> >>> >>> >>> self.followups.all.map{|f|{:when => f.date, :observations => >>> f.notes}} + .... >>> >>> >>> >>> >>> >>> >>> return ds >>> end >>> ... >>> >>> >>> >>> >>> >>> >>> end >>> >>> Por ahora funciona, pero definitivamente tiene que haber una manera mejor >>> :-P >>> >>> Un problema, por ejemplo, es que a esto no le puedo aplica will_paginate >>> con facilidad. >>> >> >> Por un lado, resolverlo de esta manera va a ser siempre complicado. >> Podrías "ayudar" a ActiveRecord escribiendo partes del SQL a mano (pero no >> creo que el resultado sea bueno, habría que ver cómo lo vas a usar, dudo que >> logres hacerlo transparente). >> >> Pero me huele a que hay algún problema de diseño. En principio, si es >> común que necesites tratar a estas dos entidades de manera polimórfica, como >> si fuesen lo mismo, y las entidades (Interview y Followup) tienen estructura >> y responsabilidades en común, sería preferible utilizar STI (Single Table >> Inheritance, usarías herencia en tus clases de Ruby y en la tabla estarían >> las columnas de las dos entidades, además de una columna "type" que los >> discrimina). >> >> En caso de que no tenga sentido usarlas polimórficamente (por que son dos >> entidades bien distintas), probablemente lo que esté faltan sea factorizar >> un entidad entidad en común (con lo que veo, se me ocurre Event que tiene >> when y notes, de manera). Aquí usarías un has_many polimórfico, esto es, >> Interview.has_many >> :events, :as => :schedulable, Followup.has_many :events, :as => >> :schedulable y Event.belongs_to :schedulable, :polymorphic => true). De >> esta manera podés listar Events sin problemas (sentite libre de elegir un >> mejor nombre que schedulable). >> >> Depende de tus requerimientos. Lo importante es que si necesitás >> manejarlos "juntos" lo reflejes en la estructura de tu modelo. >> >> Saludos, >> >> Nacho >> >> _______________________________________________ >> > > Lo que yo haría es hacer una vista en la base de datos (de esas que se > hacen con CREATE VIEW) y mapearía esa vista, como si fuese una tabla, en una > clase que hereda de ActiveRecord::Base. Entonces will_paginate debería andar > transparentemente, ya que para Rails esa vista sería igual que una tabla > común. > > Mis 2 centavos, > Aureliano. > > _______________________________________________ > Ruby mailing list > [email protected] > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar > >
La verdad que sí hay algunos problemas de diseño en la base. Es un proyecto que empecé cuando estaba aprendiendo rails medio jugando y como quién no quiere la cosa se convirtió en mi fuente de ingresos principal. Cargo igual con muchos errores del comienzo. Algunos modelos puedo unificarlos con STI, de hecho fue lo que hice antes de crear este dashboard. Pero tengo otros que son de naturaleza bastante diferente, o sobre los cuales hago cálculos intensos y me parece mejor mantenerlos en tablas separadas. En este dashboard quiero juntar toda esa información. Para esto me gustó lo de factorizar una entidad común. Lo voy a ver un poco porque no se si lo entiendo del todo, pero parecería la mejor solucion. Crear un view también es buena. Se haría con UNION no? Pero creo que para eso las tablas que *mergee* tienen que tener las mismas columnas. ¿o no es asi? Muchas gracias por la ayuda.
_______________________________________________ Ruby mailing list [email protected] http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
