回答:
このようなアクティブレコードクエリを実行すると、必要なものが得られると思います( 'Something'はモデル名です)。
Something.find(:all, :order => "id desc", :limit => 5).reverse
編集:コメントに記載されているように、別の方法:
result = Something.find(:all, :order => "id desc", :limit => 5)
while !result.empty?
puts result.pop
end
これは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
== なので、これはRails 4+では正しくありませんArray
。正しいアプローチはSomeModel.limit(5).order('id desc')
Arthur Nevesによるものであり、その結果SELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
Rails 3.1でそれを行う新しい方法は SomeModel.limit(5).order('id desc')
last(5)
、さらにチェーンするためのスコープを返すためよりも優れています。
SomeModel.limit(100).reverse_order
Rails 4(guides.rubyonrails.org/…)で使用していますが、同じです。
SomeModel.limit(5).order('id desc').pluck(:col)
行いますSELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
はるかに効率的にすべての列をつかみ、すべての廃棄よりもあるが、と1列SomeModel.last(5).map(&:col)
したSELECT *
代わりにSELECT col
、あなたは、呼び出した後摘み取ることができません(最後;遅延評価チェーンは最後で終わります)。
Something.last(5)
なぜなら:
Something.last(5).class
=> Array
そう:
Something.last(50000).count
おそらくあなたの記憶を爆破するか、永遠にかかります。
Something.limit(5).order('id desc')
なぜなら:
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"
後者は未評価のスコープです。チェーンするか、を介して配列に変換でき.to_a
ます。そう:
Something.limit(50000).order('id desc').count
...少し時間がかかります。
用レール4とバージョン以上:
あなたがしたい場合は、このような何かを試すことができます最初の最も古いエントリを
YourModel.order(id: :asc).limit(5).each do |d|
最新の最新エントリが必要な場合は、このようなものを試すことができます。
YourModel.order(id: :desc).limit(5).each do |d|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
同じであるのでチェーンする必要はありませんYourModel.order()
解決策はここにあります:
SomeModel.last(5).reverse
レールは怠け者なので、それは最終的にのようなSQLを使用してデータベースをヒットします: "SELECT table
* FROM。table
ORDER BY table
。id
DESC LIMIT 5"。
SomeModel
SELECT
table .* FROM
table` ORDER BY table
でした。id
DESC LIMIT 5`それはすべて選択を実行しません
我々は使用することができModel.last(5)
たりModel.limit(5).order(id: :desc)
、レール5.2で
このクエリは、私が気に入っている "pluck"メソッドを使用する方が優れている/高速であることがわかりました。
Challenge.limit(5).order('id desc')
これにより、出力としてActiveRecordが提供されます。したがって、次のように.pluckを使用できます。
Challenge.limit(5).order('id desc').pluck(:id)
これにより、最適なSQLコードを使用しながら、IDを配列としてすばやく取得できます。
Challenge.limit(5).order('id desc').ids
:)
Rails 3で昇順を指定するモデルのデフォルトスコープがある場合、上記のArthur Nevesで指定された順序ではなく、並べ替えを使用する必要があります。
Something.limit(5).reorder('id desc')
または
Something.reorder('id desc').limit(5)
N = 5で、モデルがMessage
であるとします。次のようなことができます。
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
SQLを見てください。
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
キーは副選択です。最初に、必要な最後のメッセージを定義する必要があります。次に、メッセージを昇順に並べる必要があります。
クエリに:orderパラメータを追加します