Risposte:
Una query di record attiva come questa penso che ti procurerebbe quello che vuoi ("Something" è il nome del modello):
Something.find(:all, :order => "id desc", :limit => 5).reverse
modifica : come notato nei commenti, un altro modo:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
Questo è il modo di Rails 3
SomeModel.last(5) # last 5 records in ascending order
SomeModel.last(5).reverse # last 5 records in descending order
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class== Array. L'approccio corretto è SomeModel.limit(5).order('id desc')per Arthur Neves, che si traduce inSELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
è il nuovo modo di farlo su binari 3.1 SomeModel.limit(5).order('id desc')
last(5)perché restituisce un margine per un ulteriore concatenamento.
SomeModel.limit(100).reverse_ordersu Rails 4 ( guide.rubyonrails.org/… ) È lo stesso.
SomeModel.limit(5).order('id desc').pluck(:col)farà ciò SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5che è molto più efficiente che afferrare tutte le colonne e scartare tutte le colonne tranne una con SomeModel.last(5).map(&:col) cui SELECT *invece di SELECT col(non puoi pizzicare dopo aver chiamato ultimo; la catena pigro-eval termina con l'ultimo).
Something.last(5)
perché:
Something.last(5).class
=> Array
così:
Something.last(50000).count
probabilmente farà esplodere la tua memoria o impiegherà un'eternità.
Something.limit(5).order('id desc')
perché:
Something.limit(5).order('id desc').class
=> Image::ActiveRecord_Relation
Something.limit(5).order('id desc').to_sql
=> "SELECT \"somethings\".* FROM \"somethings\" ORDER BY id desc LIMIT 5"
Quest'ultimo è un ambito non valutato. È possibile concatenarlo o convertirlo in un array tramite .to_a. Così:
Something.limit(50000).order('id desc').count
... ci vuole un secondo.
Per Rails 4 e versioni successive:
Puoi provare qualcosa del genere Se vuoi la prima voce più vecchia
YourModel.order(id: :asc).limit(5).each do |d|
Puoi provare qualcosa del genere se vuoi le ultime ultime voci ..
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()perché è lo stesso diYourModel.order()
La soluzione è qui:
SomeModel.last(5).reverse
Poiché le rotaie sono pigre, alla fine colpiranno il database con SQL come: "SELECT table. * FROM table ORDER BY table. idDESC LIMIT 5".
SomeModel
SELECT tabella .* FROM tabella` ORDER BY table. idDESC LIMIT 5` non esegue un seleziona tutto
possiamo usare Model.last(5)o Model.limit(5).order(id: :desc)nelle rotaie 5.2
Trovo che questa query sia migliore / più veloce per l'utilizzo del metodo "pluck", che adoro:
Challenge.limit(5).order('id desc')
Ciò fornisce un ActiveRecord come output; quindi puoi usare .pluck su di esso in questo modo:
Challenge.limit(5).order('id desc').pluck(:id)
che fornisce rapidamente gli ID come array durante l'utilizzo del codice SQL ottimale.
Challenge.limit(5).order('id desc').idsfunzionerà altrettanto bene :)
Se nel tuo modello hai un ambito predefinito che specifica un ordine crescente in Rails 3 dovrai utilizzare il riordino anziché l'ordine come specificato da Arthur Neves sopra:
Something.limit(5).reorder('id desc')
o
Something.reorder('id desc').limit(5)
Diciamo N = 5 e il tuo modello è Message, puoi fare qualcosa del genere:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Guarda sql:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
La chiave è la sottoselezione. Prima di tutto dobbiamo definire quali sono gli ultimi messaggi che vogliamo e poi dobbiamo ordinarli in ordine crescente.
Aggiungi un parametro: order alla query