运行控制器规范并检索最后一条记录时出现奇怪的RSpec行为

时间:2012-08-31 09:54:55

标签: ruby-on-rails ruby-on-rails-3 activerecord rspec rspec-rails

当我在创建操作上运行 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,所以这很奇怪

对此有何想法?

1 个答案:

答案 0 :(得分:2)

此行为非常符合逻辑:默认顺序基于created_at,您的对象都具有相同的created_at日期时间。

因此数据库必须做出(随机)选择。


实际上,我只是阅读默认顺序取决于您正在使用的数据库。为确保获得预期的效果,请使用default_scope,例如:

default_scope order('id ASC')