web-dev-qa-db-ja.com

Rails 3で最新のレコードを検索します

Rails 3のテーブルで最新のレコードを見つける方法があるかどうか疑問に思っていましたか?

ありがとう

エリオット

55
Elliot

Postモデルを指定すると、@post = Post.order("created_at").lastを実行できます

(私が@post = Post.lastをしなかった理由は、それが常に主キー(通常はid)でソートするためです。ほとんどの場合、これは問題ありませんが、きっとあるはずです。これにより問題が発生する可能性のあるシナリオ(たとえば、レコードにカスタムIDを設定する、プライマリキーの順序付け/自動番号付けに影響するデータベースの変更など)。created_atタイムスタンプによるソートにより、最新のレコードを確実に取得できます。

119
Dylan Markow

Dmarkowの答えは技術的には正しいものの、created_atにインデックスを作成するか、データベースが大きくなるにつれてクエリがますます遅くなるリスクがあります。

「id」列が自動インクリメントの主キーであることがわかっている場合(これがそうである可能性が高い)、それは定義によるインデックスであるため、そのまま使用します。

また、ARELがfind(:last)で1つのレコードのみを選択するように最適化されていない限り、すべてのレコードを選択するリスクがあり、「last()」メソッドを使用して最後のレコードのみを返します。より効率的なのは、結果を1つに制限することです。

MyModel.last(:order => "id asc", :limit => 1)

または

MyModel.first(:order => "id desc", :limit => 1)
21
jemminger

十分にトラフィックの多いテーブルでcreated_atを使用すると、あいまいさの問題が発生する可能性があります。

例えば。試してください:

INSERT INTO table (created_at) VALUES ( NOW() );
INSERT INTO table (created_at) VALUES ( NOW() );

..は同じcreated_atを持つ可能性があり、1秒の解像度しかありません。ソートはそれらを特定の順序で返しません。

マイクロタイム値を保存してソートする方が良いかもしれません。

3
RUN-CMD

はい、メソッド.lastを使用できます

したがって、モデルがPostと呼ばれる場合:

>> Post.last
=> #<Post ...>
2
DanneManne

ModelNameという名前のモデルを試してください:

record = ModelName.last
1
Sam Ritchie