Ruby on Rails单表继承(STI)和单元测试问题(使用PostgreSQL)

时间:2009-03-14 18:05:07

标签: ruby-on-rails ruby unit-testing postgresql single-table-inheritance

我正在使用带有单个“帐户”表的STI模型来保存用户和技术人员的信息(即用户<帐户,技术员&帐户)。一切都从功能的角度来看,但是在运行单元测试时会出现问题:

... 8)错误: test_the_truth(UserTest): ActiveRecord :: StatementInvalid:PGError:错误:关系“技术人员”不存在 :删除“技术人员” ...

基本上,标准框架不承认技术人员和用户表(或PostgreSQL称之为“关系”)不存在,实际上应该为帐户别名。

有什么想法吗?我对RoR比较陌生,我不知道怎么解决这个问题而不是一起扯掉STI。

3 个答案:

答案 0 :(得分:12)

原来问题是由于存在:

./测试/装置/ technicians.yml   ./test/fixtures/users.yml

这是有道理的,因为框架期望能够将数据插入到类似命名的表中。

答案 1 :(得分:2)

通过删除子模型的YAML文件,我遇到了类似的问题。基本上rails正在查看在/ test / fixtures /中创建的fixture,并尝试清空每个表,以便它可以为您重新加载它们。

在我的情况下,我运行了脚本/生成模型命令,该命令自动创建一个新的夹具。然后我将模型更改为从正确的父类继承。好吧,由于夹具仍然存在,rails在加载灯具之前试图从孩子那里删除。

如果您确实需要预加载数据,则应使用父模型夹具并将类型字段设置为正确的型号名称。

答案 2 :(得分:0)

  • 您确定自己的帐户表包含“类型”列吗?你需要一个才能使STI发挥作用。
  • 我实际上遇到了一个名为'type'的列的数据库兼容性问题,偶尔会切换到'kind'来缓解这个问题。那可能是问题所在;尝试在基类(Account)中设置self.inheritance_column =“kind”,看看是否有帮助。