0

これは、作成アクションでPostsController仕様を実行したときのデバッガーからのログです。コンソールを使用して実行時にdbレコードを変更または操作していないため、これは特別なケースではありません。

(rdb:1) p Post.last
#<Post id: 2, author_id: 3, title: "My ultra cool post", content: "Lorem ipsum", deleted_at: nil, created_at: "2012-08-31 09:21:20", updated_at: "2012-08-31 09:21:20", published_at: nil, display_from: nil>

(rdb:1) p Post.all
[#<Post id: 2, author_id: 3, title: "My ultra cool post", content: "Lorem ipsum", deleted_at: nil, created_at: "2012-08-31 09:21:20", updated_at: "2012-08-31 09:21:20", published_at: nil, display_from: nil>, 
 #<Post id: 3, author_id: 2, title: "My ultra cool post", content: "Lorem ipsum", deleted_at: nil, created_at: "2012-08-31 09:21:20", updated_at: "2012-08-31 09:21:20", published_at: nil, display_from: nil>]

(rdb:1) p Post.last
#<Post id: 2, author_id: 3, title: "My ultra cool post", content: "Lorem ipsum", deleted_at: nil, created_at: "2012-08-31 09:21:20", updated_at: "2012-08-31 09:21:20", published_at: nil, display_from: nil>

したがって、Post.allは、Post 3は存在するが、Post.lastは存在しないことを示しています。

しかし、私がするとき

(rdb:1) p Post.all.last
#<Post id: 3, author_id: 2, title: "My ultra cool post", content: "Lorem ipsum", deleted_at: nil, created_at: "2012-08-31 09:21:20", updated_at: "2012-08-31 09:21:20", published_at: nil, display_from: nil>

コントローラファイル:

class PostsController < ApplicationController
  def create
    @post.author = current_user
    @post.save
    debugger # this is where I'm debugging
    respond_with @post
  end
end
  • この動作は、開発されたコードで正しく機能します

私にとっての唯一の意味は、私の仕様では私がやるということです

 response.should redirect_to Post.all.last

 response.should redirect_to Post.last

Ralisでは、DBの準備が整う前にActive Recordが呼び出しをトリガーする場合があることを知っていますか?しかし、この場合、ActiveRecordは実際には.all呼び出しでこのレコードの存在を認識していますが、.lastでは認識していないため、これは奇妙なことです

これについて何か考えはありますか?

4

1 に答える 1

2

この動作は非常に論理的です。デフォルトの順序はに基づいてcreated_atおり、オブジェクトは両方とも同じcreated_at日時になります。

したがって、データベースは(ランダムな)選択を行う必要があります。


実際、私は読んだだけです。デフォルトの順序は、使用しているデータベースによって異なります。期待どおりの結果が得られるようにするにはdefault_scope、たとえば次のように使用します。

default_scope order('id ASC')
于 2012-08-31T09:59:34.007 に答える