On 10/30/07, Damian Janowski <[EMAIL PROTECTED]> wrote:
> On 10/30/07, Diego Algorta Casamayou <[EMAIL PROTECTED]> wrote:
> > Para que se hagan una idea... Esta parece ser una solución usando 
> > find_by_sql:
> >
> > class AcademicProgram < ActiveRecord::Base
> >   belongs_to :location
> >
> >   def self.related_locations
> >     Location.find_by_sql("SELECT DISTINCT l.* FROM academic_programs p
> > LEFT JOIN locations l ON p.location_id = l.id")
> >   end
> > end
> >
> > Entonces puedo hacer esto en el controller:
> >
> > AcademicProgram.related_locations.map(&:name)
> >
> > Y con eso obtengo un Array con los nombres de las locations que tienen
> > al menos un academic_program.
> >
> > Pero me gustaría saber si alguien conoce otra solución. Mejor si no
> > usa find_by_sql.
>
> La que te pasé antes ;)

Oops! Ya contesté esa. ;)


>
> The Rails Way pareciera ser agregar el counter_cache a locations. Le
> ponés el campo academic_programs_count a locations, y después en el
> modelo AcademicProgram:
>
> belongs_to :location, :counter_cache => true
>
> Y luego siempre y cuando hagas todo bien,
>
> class Location < ...
>   def self.with_academic_programs
>     find(:all, :conditions => 'academic_programs_count > 0')
>   end
> end
>

Esta solución es buena. Incluso evita el join entre tablas lo cual la
hace ganar el premio de ser la más ágil y rápida diría yo.

Pero hay dos problemas con este approach:

* los counter_cache sólo se mantienen actualizados si las operaciones
de alta y baja son realizados a través del association proxy.
Entonces, si hago AcademicProgram.create(...) el counter_cache en
locations NO se actualiza. Sólo se actualiza si hago:
Location#academic_programs.create(...). A veces, uno utiliza algún
plugin para las pantallas de administración (roar en mi caso) y estos
no tienen en cuenta estas cositas... Sí, podría ver de actualizar
roar, pero por ahora no.

* Sucede que AcademicProgram tiene otras 3 relaciones del tipo
belongs_to además de location. Qué pasa si quiero poner un
counter_cache en más de una de estas relaciones? Ya no tengo forma de
mantenerlas a todas "the rails way" porque sólo puedo optar por hacer
el create o build desde una de ellas con lo cual los counter_cache de
las otras quedan sin actualizar. Agradezco me desaznen si estoy
equivocado.


> PD: Usá acts_as_dropdown que te va a venir bien.

Sí. Está bueno. Roar incluye una funcionalidad muy similar que vengo
usando: Model.to_select
Pero creo que sólo funciona a nivel de clase y no de instancia, así
que voy a agregar to_dropdown a mi toolkit. Gracias!

-- 
Diego Algorta Casamayou
http://www.oboxodo.com - http://diego.algorta.net
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar

Responder a