# Ordinare i risulati secondo una somma

**URL:** <https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521>\
**Category:** IT\
**Created:** [November 7, 2007, 5:59pm UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521 "2007-11-07T17:59:38Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [November 7, 2007, 5:59pm UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521/1 "2007-11-07T17:59:38Z")

</div>

Allora ho 2 modelli

class Core \< ActiveRecord::Base  
has\_many :votes  
end

class Vote \< ActiveRecord::Base  
belongs\_to:core  
end

in votes ci sono voti per ogni core (-1,0,1)

Devo visualizzare una classifica dei 10 core con voti + alti.

come devo modificare questa chiamata?  
Event.find(:all,:include=\>[:votes]))

Grazie

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [November 7, 2007, 6:25pm UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521/2 "2007-11-07T18:25:05Z")

</div>

Il giorno 07/nov/07, alle ore 17:59, Luca R. ha scritto:

votes = Vote.sum(:attributo\_voto, :group =\> :core, :order =\>  
“sum\_attributo\_voto DESC”)

votes.each do |core, vote|

# fai quello che vuoi con i core

end

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [November 7, 2007, 7:32pm UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521/3 "2007-11-07T19:32:10Z")

</div>

Ma Ã¨ possibile ottenere dal metodo sum anche attributi del modello core  
ad es. name senza eseguire altre query?  
Grazie  
Giovanni I. wrote:

> Il giorno 07/nov/07, alle ore 17:59, Luca R. ha scritto:
> 
> votes = Vote.sum(:attributo\_voto, :group =\> :core, :order =\>  
> “sum\_attributo\_voto DESC”)
> 
> votes.each do |core, vote|
> 
> # fai quello che vuoi con i core
> 
> end

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [November 7, 2007, 7:46pm UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521/4 "2007-11-07T19:46:28Z")

</div>

Il metodo che ti ho suggerito contiente tutti gli attributi di core.

Il giorno 07/nov/07, alle ore 19:32, Luca R. ha scritto:

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [November 7, 2007, 9:40pm UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521/5 "2007-11-07T21:40:13Z")

</div>

Giovanni I. wrote:

> Il metodo che ti ho suggerito contiente tutti gli attributi di core.
> 
> Il giorno 07/nov/07, alle ore 19:32, Luca R. ha scritto:

Ok solo che oltre al modello vote associato al modello core ho anche il  
modello message e oltre al voto per ogni core ho bisogno anche di sapere  
il numero di messaggi.

Quindi con il tuo metodo mi sa che non Ã¨ possobile avere tutti gli  
attributi in una volta sola. Nel ciclo dovrei inserire una query per  
ottenere anche il numero di messages associati al core.

spero di sbagliare.  
cmq grazie per la pazienza.  
Sono ancora agli inizi, (vengo da php)

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [November 8, 2007, 9:10am UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521/6 "2007-11-08T09:10:23Z")

</div>

Allora ho fatto cosi:  
Event.find(:all,:include =\> :event\_dates, :joins=\>“LEFT JOIN (SELECT  
SUM(vote) as vote\_total,core\_id FROM votes GROUP BY core\_id) as  
votes\_join ON votes\_join.core\_id=cores.id”, :readonly =\>  
false,:conditions=\>“date\_add(event\_dates.date, INTERVAL  
event\_dates.number\_days DAY)\>=CURDATE()”,:order=\>“vote\_total  
desc”,:limit=\>10)

Solo che su event non vedo vote\_total. cosa devo fare per vederlo?  
Grazie

Giovanni I. wrote:

> Il giorno 07/nov/07, alle ore 21:40, Luca R. ha scritto:  
> Per averli tutti in una volta sola devi usare find\_by\_sql e costruire  
> a mano la query (cosa assolutamente indicata per motivi di performance).

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [November 8, 2007, 9:05am UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521/7 "2007-11-08T09:05:35Z")

</div>

Il giorno 07/nov/07, alle ore 21:40, Luca R. ha scritto:

> Quindi con il tuo metodo mi sa che non è possobile avere tutti gli  
> attributi in una volta sola. Nel ciclo dovrei inserire una query per  
> ottenere anche il numero di messages associati al core.

Per averli tutti in una volta sola devi usare find\_by\_sql e costruire  
a mano la query (cosa assolutamente indicata per motivi di performance).

---

<div class="post-metadata">

**Author:** ![stratboy](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/838e76/32.png) [@stratboy](https://www.ruby-forum.com/u/stratboy)\
**Post date:** [November 8, 2007, 9:19am UTC](https://www.ruby-forum.com/t/ordinare-i-risulati-secondo-una-somma/119521/8 "2007-11-08T09:19:40Z")

</div>

Se fai il left join senza fare anche il select di ciò che ti serve non  
hai nel resultset i dati che hai joinato.

Es.

SELECT A.foo FROM A LEFT JOIN B ON A.bar = B.bar non ti dà i campi di B.

Dovresti fare

SELECT A.foo, B.bar FROM A LEFT JOIN B ON A.bar = B.bar.

L’unica soluzione è usare find\_by\_sql.

Il giorno 08/nov/07, alle ore 09:10, Luca R. ha scritto:
