2010/7/31 Instr. Dwayne Macgowan <[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 =>
:schedulabley 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
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a