当我在创建操作上运行 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显示帖子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
insted of
response.should redirect_to Post.last
我知道在Ralis中有些情况下Active Record会在DB准备好之前调用吗?但是在这种情况下,ActiveRecord实际上通过.all调用知道这条记录的存在而不是.last,所以这很奇怪
对此有何想法?
答案 0 :(得分:2)
此行为非常符合逻辑:默认顺序基于created_at
,您的对象都具有相同的created_at
日期时间。
因此数据库必须做出(随机)选择。
实际上,我只是阅读默认顺序取决于您正在使用的数据库。为确保获得预期的效果,请使用default_scope
,例如:
default_scope order('id ASC')