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_order
su 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 5
che è 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
. id
DESC LIMIT 5".
SomeModel
SELECT
tabella .* FROM
tabella` ORDER BY table
. id
DESC 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').ids
funzionerà 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