Ordinare risultati find in base a campo esterno

Buondì!
Ho due quesiti da proporre!
il primo, molto semplice:
c’è un modo più UMANO di scrivere questo ciclo?

News più commentate

<% i = 5 %> <% for neew in @neews_piu_commentate %>

<%=h neew.titolo %> (<%= >neew.comments.size >%> commenti)

<% i -= 1 %> <% if i== 0 %> <% break %> <% end %> <% end %>

so che fa schifo, ma la programmazione non è il mio pane quotidiano(e
poi x me l’importante è sempre che funzioni, e almeno questo funziona
;p)

secondo:
ho il modello neews, che has_many :comments, e il modello comments, che
belongs_to :neew
In quel ciclo di prima io stamperei a video le prime 5 news più
commentate, (ovvero che hanno neew.comments.size maggiore). Il problema
è come ordinare l’array da cui tirar fuori i commenti in base al numero
di commenti presente nella news…
nella index del controller delle news le ho provate tutte:

@neews_piu_commentate = Neew.find(:all, :order =>
@neews_piu_commentate.comments.size DESC’)
oppure
@neews_piu_commentate = Neew.find(:all, :include => .comments, :order =>
‘newsComments.size DESC’)
oppure
@neews_piu_commentate = Neew.find(:all, :order => ‘comments.size DESC’)

ma non funziona proprio!
Se qualcuno sa darmi una mano grazie mille!
Giorgio

2009/12/2 Giorgio A. [email protected]:

In quel ciclo di prima io stamperei a video le prime 5 news più
commentate, (ovvero che hanno neew.comments.size maggiore). Il problema
è come ordinare l’array da cui tirar fuori i commenti in base al numero
di commenti presente nella news…

potresti usare aggiungere a Neews una colonna che faccia da “counter
cache” e poi ordinare su quella, vedi qui:

http://asciicasts.com/episodes/23-counter-cache-column

ciao,
Luca

Ciao!

Parto dal fondo.

Per selezionare e ordinare le news più commentate potresti usare:

@neews_piu_commentate = Neew.find(:all, :limit => 5, :include =>
:comments, :group => “#{Neews.table_name}.id”, :order =>
“count(#{Comment.table_name}.id) DESC”)

A questo punto, visto che hai già limitato la ricerca ai primi 5
risultati, puoi ciclare con:

News più commentate

<% @neews_piu_commentate.each do |neew| %>

<%=h neew.titolo %> (<%= >neew.comments.size >%> commenti)

<% end %>

Ciao,
Silvano

2009/12/2 Giorgio A. [email protected]:

                 <span style="font-size: 10px; font-style: italic;">(<%= >neew.comments.size >%> commenti)

;p)
oppure


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Considera l’ambiente prima di stampare questa email. Dai, che
l’equazione è semplice: meno A4, più alberi.

. . . Silvano S. . . .
email: [email protected]
site: http://www.sistrall.it

Il 02 dicembre 2009 16.00, Giorgio A. [email protected] ha scritto:

                 <span style="font-size: 10px; font-style: italic;">(<%= >neew.comments.size >%> commenti)
                 </span>
          </p>

<% i -= 1 %>
<% if i== 0 %>
<% break %>
<% end %>
<% end %>

  • fatti passare direttamente 5 oggetti (usando :limit => 5 nel find) e
    butta tutte le istruzioni con i;
  • non costruire tu href nei link, usa piuttosto link_to.

poi x me l’importante è sempre che funzioni, e almeno questo funziona

se, una volta che funziona, sei pronto a farti fucilare piuttosto che
fare modifiche, fai pure; in caso contrario, forse non basta che
funzioni…

secondo:
ho il modello neews, che has_many :comments, e il modello comments, che
belongs_to :neew
In quel ciclo di prima io stamperei a video le prime 5 news più
commentate, (ovvero che hanno neew.comments.size maggiore). Il problema
è come ordinare l’array da cui tirar fuori i commenti in base al numero
di commenti presente nella news…

prova una cosa tipo questa:

@neews_piu_commentate = Neews.all :limit => 5, :joins => :comments,
:group => ‘neews.id’, :order => ‘count(comments.id) DESC’

pietro

Hai provato:

neew.comments.count

invece di neew.newsComments.size?

Ciao,
Silvano

PS: sorry per il plurale…

2009/12/2 Giorgio A. [email protected]:

size quando stampo questo:

(<%= neew.newsComments.size > %> commenti)
esce sempre (1 commenti), anche quando sono più di 1…non riesco a
capire perchè…grazie mille!

Posted via http://www.ruby-forum.com/.


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Considera l’ambiente prima di stampare questa email. Dai, che
l’equazione è semplice: meno A4, più alberi.

. . . Silvano S. . . .
email: [email protected]
site: http://www.sistrall.it

  • non costruire tu href nei link, usa piuttosto link_to.
    ci penso sempre a questa cosa, solo che poi siccome ad un certo punto mi
    sembra più complicato uso href…perchè conviene usare link_to?

Grazie a tutti…seguendo Silvano(che ho letto x primo) ho messo questa
find

@neews_piu_commentate = Neew.find(:all, :limit => 5, :include =>
:comments, :group => “#{Neew.table_name}.id”, :order =>
“count(#{Comment.table_name}.id) DESC”)

tra l’altro c’era Neews.table_name, che non mi funzionava, e invece
funziona mettendo neew al singolare;
adesso l’ordinamento è giusto, ma x qualche strano motivo mi sbaglia la
size quando stampo questo:

(<%= neew.newsComments.size > %> commenti)
esce sempre (1 commenti), anche quando sono più di 1…non riesco a
capire perchè…grazie mille!

:slight_smile:

count è il metodo che restituisce il numero di elementi in una
relazione has_many.
Lo trovi documentato piuttosto bene qui:
http://railsapi.com/doc/rails-v2.3.4/ (è un sinonimo del metodo size).

In pratica è l’equivalente di Comment.count([‘neews.id = ?’, id della
news])

Ciao,
Silvano

2009/12/2 Giorgio A. [email protected]:

@neews_piu_commentate = Neew.find(:all, :limit => 5, :include => :comments, >:group => “#{Neew.table_name}.id”, :order => "count(#
http://lists.ruby-it.org/mailman/listinfo/ml


Considera l’ambiente prima di stampare questa email. Dai, che
l’equazione è semplice: meno A4, più alberi.

. . . Silvano S. . . .
email: [email protected]
site: http://www.sistrall.it

Silvano S. wrote:

Hai provato:

neew.comments.count

invece di neew.newsComments.size?

yess ora funziona!
…quando hai qualche minuto di tempo, se puoi spiegarmi bene il
funzionamento di

@neews_piu_commentate = Neew.find(:all, :limit => 5, :include => :comments, >:group => “#{Neew.table_name}.id”, :order => “count(#
{Comment.table_name}.id) DESC”)
mi faresti un altro grande favore…niente fretta naturalmente :stuck_out_tongue:
non riesco a capire bene cosa succede, nè cos’è count…
Grazie ancora!

Il 02 dicembre 2009 17.11, Giorgio A. [email protected] ha scritto:

  • non costruire tu href nei link, usa piuttosto link_to.
    ci penso sempre a questa cosa, solo che poi siccome ad un certo punto mi
    sembra più complicato uso href…perchè conviene usare link_to?

Se usi le risorse (resources), è semplicissimo:

<%=h neew.titolo %>

diventa:

<%= link_to h(neew.titolo), neew %>

In caso contrario (per il quale però ci vuole una buona ragione), puoi
comunque semplificare le cose creando delle custom routes e usare
quelle come parametro per link_to.

Allo stesso modo, se devi usare url strane con parecchi parametri, ti
conviene comunque creare delle custom routes, così non devi né
costruire la url manualmente né passare a link_to il nome del
controller né quello dell’action.

Perché tutto
ciò?
Primo perché così scrivi meno codice, e meno codice scrivi, meno bug
ti scappano; secondo, perché quando cambierai idea e stravolgerai
completamente tutto lo schema delle url, dovrai modificare solo il
file routes.rb, e non ogni singola view e ogni singolo controller
(per i redirect); terzo, perché l’unico caso in cui questo metodo non
va bene è il caso in cui le tue url non seguono uno schema logico, il
che di solito è un male, per cui se scopri che ti stai trovando molto
male con resources, custom routes e link_to, potrebbe essere un serio
indizio del fatto che forse c’è qualcosa nella tua applicazione che
merita di essere riconsiderato.

pietro

Giorgio A. wrote:

  • non costruire tu href nei link, usa piuttosto link_to.
    ci penso sempre a questa cosa, solo che poi siccome ad un certo punto mi
    sembra più complicato uso href…perchè conviene usare link_to?

La domanda dovrebbe essera al contrario: perchè non usare link_to che è
più semplice? Potrebbe valere la pena non usare link_to per un discorso
di prestazioni, all’interno di un ciclo consistente ma poi nella realtÃ
non capita mai perchè le view non dovrebbero mai essere molto grosse
quindi usa link_to e ringraziamo in coro gli helper di rails