Rails,fixtures和default_scope

时间:2013-07-29 10:49:55

标签: ruby-on-rails activerecord fixtures

我有一个模型夹具" SoftwareVersion":

testing:
  id: 4
  version: "4.0"
  file_name: MyString4
  is_testing: true

该模型的默认范围:

 default_scope where(is_testing: false)

如果我在测试中这样做:

software_versions(:testing)

我收到错误:

ActiveRecord::RecordNotFound: Couldn't find SoftwareVersion with id=4 [WHERE `software_versions`.`is_testing` = 0]

这是预期的行为吗?我该如何覆盖呢?

2 个答案:

答案 0 :(得分:3)

是的,这是预期的行为,默认范围将影响所有查询。使用unscoped再次启动干净查询:

SoftwareVersion.unscoped.where(is_testing: true)
SoftwareVersion.unscoped.find(id: 4)
etc.

但除此之外,如果您使用相同的表(带有灯具)来存储生产和测试记录,那么您做错了。 Rails使用完全不同的数据库进行测试,因此您不需要列来区分。如果你把灯具放在test/fixtures下面,它们将永远不会被装入生产中。

答案 1 :(得分:2)

行为符合预期,唯一的问题是在测试数据库中没有SoftwareVersion的记录。您只需在运行测试之前填充数据库。如您所见,查询完成WHERE software_versions.is_testing = 0,零意味着falsedefault_scope一样。