Rails 3のテーブルで最新のレコードを見つける方法があるかどうか疑問に思っていましたか?
ありがとう
エリオット
Postモデルを指定すると、@post = Post.order("created_at").last
を実行できます
(私が@post = Post.last
をしなかった理由は、それが常に主キー(通常はid
)でソートするためです。ほとんどの場合、これは問題ありませんが、きっとあるはずです。これにより問題が発生する可能性のあるシナリオ(たとえば、レコードにカスタムIDを設定する、プライマリキーの順序付け/自動番号付けに影響するデータベースの変更など)。created_at
タイムスタンプによるソートにより、最新のレコードを確実に取得できます。
Dmarkowの答えは技術的には正しいものの、created_atにインデックスを作成するか、データベースが大きくなるにつれてクエリがますます遅くなるリスクがあります。
「id」列が自動インクリメントの主キーであることがわかっている場合(これがそうである可能性が高い)、それは定義によるインデックスであるため、そのまま使用します。
また、ARELがfind(:last)で1つのレコードのみを選択するように最適化されていない限り、すべてのレコードを選択するリスクがあり、「last()」メソッドを使用して最後のレコードのみを返します。より効率的なのは、結果を1つに制限することです。
MyModel.last(:order => "id asc", :limit => 1)
または
MyModel.first(:order => "id desc", :limit => 1)
十分にトラフィックの多いテーブルでcreated_at
を使用すると、あいまいさの問題が発生する可能性があります。
例えば。試してください:
INSERT INTO table (created_at) VALUES ( NOW() );
INSERT INTO table (created_at) VALUES ( NOW() );
..は同じcreated_at
を持つ可能性があり、1秒の解像度しかありません。ソートはそれらを特定の順序で返しません。
マイクロタイム値を保存してソートする方が良いかもしれません。
はい、メソッド.lastを使用できます
したがって、モデルがPostと呼ばれる場合:
>> Post.last
=> #<Post ...>
ModelName
という名前のモデルを試してください:
record = ModelName.last