web-dev-qa-db-ja.com

activerecordで最後のN個のレコードを取得する方法は?

クエリで:limitを使用すると、最初のNレコードが取得されます。最後のNレコードを取得する最も簡単な方法は何ですか?

154
JtR

このようなアクティブレコードクエリは、あなたが望むものを取得すると思います(「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
140
Dan McNevin

これはRails 3つの方法です

SomeModel.last(5) # last 5 records in ascending order

SomeModel.last(5).reverse # last 5 records in descending order
254
Bongs

Rails 3.1でそれを行う新しい方法はSomeModel.limit(5).order('id desc')

50
Arthur Neves

Rails 4以降のバージョン:

必要に応じて、このようなものを試すことができます最初の最も古いエントリ

YourModel.order(id: :asc).limit(5).each do |d|

必要に応じて、このようなものを試すことができます最後の最新エントリ ..

YourModel.order(id: :desc).limit(5).each do |d|
30
Gagan Gami

解決策はこちら:

SomeModel.last(5).reverse

Railsは遅延しているため、最終的に次のようなSQLでデータベースにヒットします。「SELECT table。* FROM table ORDER BY table.id DESC LIMIT 5 "。

25
Developer

Rails 5の場合(そしておそらくRails 4)

悪い:

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

...時間がかかります。

24
Amin Ariana

Rails (Rails 4.2)プロジェクトでは、次を使用します

Model.last(10) # get the last 10 record order by id

そしてそれは動作します。

4
timlentse

結果に何らかの順序を設定する必要がある場合は、次を使用します。

Model.order('name desc').limit(n) # n= number

順序付けが不要で、テーブルに保存されたレコードだけが必要な場合:

Model.last(n) # n= any number
4
Thorin

ちょうど試して:

Model.order("field_for_sort desc").limit(5)
2
Thorin

私が気に入っている「pluck」メソッドを使用すると、このクエリの方が優れている/速いことがわかります。

Challenge.limit(5).order('id desc')

これにより、ActiveRecordが出力されます。次のように.pluckを使用できます。

Challenge.limit(5).order('id desc').pluck(:id)

最適なSQLコードを使用しながら、配列としてIDをすばやく提供します。

1

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

キーは副選択です。最初に、必要な最後のメッセージを定義する必要があります。次に、昇順に並べる必要があります。

0

モデルにRails 3の昇順を指定するデフォルトのスコープがある場合、上記のArthur Nevesで指定された順序ではなく、並べ替えを使用する必要があります。

Something.limit(5).reorder('id desc')

または

Something.reorder('id desc').limit(5)
0
scifisamurai