2011-06-09 11 views
5

Sto usando Mongoid per lavorare con MongoDB. Va tutto bene, mi piace molto e così via. Nella mia applicazione blog (regolatore di messaggi, azioni indice) Ho questo codice:Ottenere l'ultimo documento del risultato di query Mongoid limitato e .count()

@posts = Post.without(:comments) 
@posts = @posts.my_search(params[:s]) if params[:s] 
@posts = @posts.order_by([:created_at, :desc]) 
@posts = @posts.where(:pid.lt => params[:p].to_i+1) if params[:p] 
@posts = @posts.limit(items_per_page+1) 

La parte con il "dove" è la realizzazione di mio metodo di impaginazione (permette di risultati della pagina in una sola direzione, ma senza skip(), quello che considero un vantaggio). Ora, ci sono alcuni piccoli problemi che mi fanno sentire a disagio:

Per la mia impaginazione al lavoro ho bisogno di ottenere l'ultimo post entro quel limite. Ma quando faccio @posts.last sto ottenendo l'ultimo documento dell'intera query senza limiti. Ok, questo è strano, ma non è un grosso problema. Oltre a questo, i risultati delle query si comportano come un array quasi normale, quindi in questo momento sto ottenendo l'ultimo elemento con @posts.pop (divertente, ma non rimuove alcun documento) o @posts.fetch(-1)

Ho la sensazione che questo non è "la strada giusta" e c'è qualcosa di più elegante. Anche @posts.count genera una seconda query esattamente uguale alla prima (senza limite) ma con "conteggio" solo e non mi piace.

Se faccio l'ultima riga assomigliare

@posts = @posts.limit(items_per_page+1).to_ary 

per convertire i risultati delle query in una matrice, tutto ciò genera solo una query (buono), ma ora @posts.count fermate riferire quello che mi serve (importo totale dei documenti senza limiti applicato) e si comporta esattamente come @posts.size - restituisce items_per_page+1 o meno (cattivo).

Così, qui sono le mie domande:

1) Che cosa è un modo "corretto" per ottenere l'ultimo documento di risultati della query entro il termine dato?

2) Come ottenere la quantità totale di documenti con determinate condizioni applicate senza generare query aggiuntive?

UPD:

3) @ posts.first genera query aggiuntiva, come prevenirla e solo ottenere primo documento prima di iterare tutti i documenti?

risposta

3

Ottenere l'ultimo documento:

Post.last 

Ottenere ultimo documento con alcune altre query:

Post.order_by([:created_at, :desc]).last 

Come documenti Numero totale:

Post.order_by([:created_at, :desc]).count 

Raccomandazione: Basta utilizzare il costruito nel paginazione

@posts = Post.limit(10).paginate(:page=>pararms[:page]) 

tardi:

<%= will_paginate @posts %> 

Per quanto riguarda le query aggiuntive - mongoid carichi pigro tutto:

@posts = Post.all #no query has been run yet 
@posts.first #Ok, a query has finally been run because you are accessing the objects 
+0

Stai rispondendo alle domande Non ho chiesto :) Aggiungere .limit (2) prima . Ultimo e vediamo come si comporterà. Inoltre .count genera query aggiuntive e ho chiesto come evitarlo. Ho rimosso will_paginate e kaminari perché non mi piace skip() e anche perché non permettono di "saltare" su un post specifico nell'azione indice. Inoltre, prova a ripetere con @ posts.each dopo @ post.first, vedrai 2 query. –

+0

Se si desidera avere solo una query, è necessario inserire tutto in un array. @posts = Post.whatever.all.to_a ... quindi @ posts.first e @ posts.last saranno metodi di enumerazione ruby ​​e non comandi mongoid. –

+0

Sì, ne ho scritto nella mia domanda, ma @ posts.count genera query aggiuntive se lo eseguo prima di to_ary, e restituisce solo un importo limitato se lo eseguo dopo. C'è un modo per eseguire query e contare i risultati in esso prima di limit()? –

Problemi correlati