Donat:
class A < ActiveRecord::Base
has_many Bs
end
class B < ActiveRecord::Base
belongs_to A
end
Volem fer una consulta que ens doni totes les As tals que tinguin Bs,
i OBVIAMENT no volem As duplicats.
El primer que em bé al cap és
A.all(:joins => [Bs]) #simple, senzill i... erroni!
però...
A.all(:joins => [Bs]).size >= A.count
I que vol dir? Doncs com que rails està fent un "inner join" ens torna
molts resultats duplicats quant un A tingui varis Bs.
Per arreglar aixó se m'ocurreix?
A.all(:joins => [Bs], :group => :id) #Funciona, però un "group by"
sol ser lent, i si hi ha més condicions...
A.all(:joins => [Bs], :select => "distinct(as.*)") #Funciona, però
generem acoblament...
B.all.collect{|b| b.a}.uniq #Funciona, però és lent i guarro de collons
Arribats a aquest punt... quina és la millor solució que se us
ocurreix / feu servir? Segurament pensareu que és una pregunta xorra,
però em toca els nassos haver de fer coses rares al mig del codi.
Apale fins ara
--
Lleïr Borràs i Metje
http://lleirborras.blogspot.com
http://twitter.com/lleirborras
http://github.com/lleirborras
Jo vull As ;-)
Lleir Borras Metje
El 04/12/2009 16:28, "Iván Belmonte" <iv...@ivanhq.net> escribió:
Hola
Jo soc un patata programant i segur que la cago, pero no es podria fer
aixi?
B.all(:select => 'DISTINCT(a_id)')
Salu2
--
Real_men_dont_need_spacebars
On Dec 4, 2009, at 15:39 , LLeïr Borràs wrote: > > A veure, aixó ho podria "postejar" a la llista ...
> Volem fer una consulta que ens doni totes les As tals que tinguin Bs,
> i OBVIAMENT no volem As duplicats.
>
> El primer que em bé al cap és
>
> A.all(:joins => [Bs]) #simple, senzill i... erroni!
-- I pq es erroni aixo?
> Per arreglar aixó se m'ocurreix?
>
> A.all(:joins => [Bs], :group => :id) #Funciona, però un "group by"
> sol ser lent, i si hi ha més condicions...
-- Home jo crec que aquesta es l'unica manera. Ara, si necessites
performance hauries d'utilitzar un indexador crec, no?
--
Real_men_dont_need_spacebars
Jo diria, que en la seguent instruccio
Rails, el que fa es fer un group by de b per a_id i fer un joins en
A.all :conditions => ‘bs_count > 0’
memoria amb A. Entenc que si hi han pocs registres es una solucio
bona. Pero si hi han molt registres aixo te un cost alt en la BBDD i
mes, si en el group by no s'aplica el where corresponent.