クエリで:limit
を使用すると、最初のNレコードが取得されます。最後のNレコードを取得する最も簡単な方法は何ですか?
このようなアクティブレコードクエリは、あなたが望むものを取得すると思います(「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
Rails 3.1でそれを行う新しい方法はSomeModel.limit(5).order('id desc')
Rails 4以降のバージョン:
必要に応じて、このようなものを試すことができます最初の最も古いエントリ
YourModel.order(id: :asc).limit(5).each do |d|
必要に応じて、このようなものを試すことができます最後の最新エントリ ..
YourModel.order(id: :desc).limit(5).each do |d|
解決策はこちら:
SomeModel.last(5).reverse
Railsは遅延しているため、最終的に次のようなSQLでデータベースにヒットします。「SELECT table
。* FROM table
ORDER BY table
.id
DESC LIMIT 5 "。
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
...時間がかかります。
Rails (Rails 4.2)
プロジェクトでは、次を使用します
Model.last(10) # get the last 10 record order by id
そしてそれは動作します。
結果に何らかの順序を設定する必要がある場合は、次を使用します。
Model.order('name desc').limit(n) # n= number
順序付けが不要で、テーブルに保存されたレコードだけが必要な場合:
Model.last(n) # n= any number
ちょうど試して:
Model.order("field_for_sort desc").limit(5)
私が気に入っている「pluck」メソッドを使用すると、このクエリの方が優れている/速いことがわかります。
Challenge.limit(5).order('id desc')
これにより、ActiveRecordが出力されます。次のように.pluckを使用できます。
Challenge.limit(5).order('id desc').pluck(:id)
最適なSQLコードを使用しながら、配列としてIDをすばやく提供します。
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
キーは副選択です。最初に、必要な最後のメッセージを定義する必要があります。次に、昇順に並べる必要があります。
モデルにRails 3の昇順を指定するデフォルトのスコープがある場合、上記のArthur Nevesで指定された順序ではなく、並べ替えを使用する必要があります。
Something.limit(5).reorder('id desc')
または
Something.reorder('id desc').limit(5)