0

我正在为某些软件编写规范并得到一个奇怪的行为:在我正在测试的方法中,我正在调用:

MyModel.where(special_identifier: opts[:ident]).first || MyModelBuilder.new(m).build 

(注意我不想要 first_or_create 或 first_or_new 因为我在这里使用显式构建器)。当我查询时,MyModel.where(...)我应该取回一个ActiveRecord::Relation对象,这就是它在 prod、dev、console 等中的行为方式。但是,在运行规范时,会where返回一个MyModel对象。这是一个错误,我错过了什么吗?

4

2 回答 2

1

正如@DVG 在评论中所说,MyModel.where(...)返回一个关系,但调用.firstor.last应该返回一个实例,而不是一个关系。类似地,如果 where 返回多个记录,则关系上的.limit(...).to_a.all将返回记录集。

如果您正在这样做MyModel.where(...)并且它绝对没有返回关系,那么您需要弄清楚发生了什么:

if !MyModel.where('').is_a? ActiveRecord::Relation
  raise "where was defined in #{MyModel.method(:where).source_location}"
end

fail如果在规范中,那么加注可能是一个。

如果这不起作用,请参阅此答案以获取更多获取方法来源的方法。

现在如果.first返回 nil,那么你的代码:

MyModel.where(special_identifier: opts[:ident]).first || MyModelBuilder.new(m).build

将返回任何MyModelBuilder.new(m).build回报(或者它可能会引发一些事情)。

于 2013-05-28T20:57:42.817 回答
1

听起来您的数据库中有状态。警惕before(:all)可能导致这种情况的块。也可以考虑像database_cleaner宝石这样的东西。

于 2013-05-28T20:09:05.350 回答