rails 3.1.3 has_many / belongs_to fixtures不相等?

时间:2012-05-18 22:07:39

标签: ruby-on-rails

假设有两种模式:

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

及其相关的灯具:

foos.yml:

one:
  ...

bars.yml:

one:
  foo: one

two:
  foo: one

然后是一个测试用例:

test "fixtures equal?" do
  foo = foos(:one)
  assert_equal foo, foo.bars.first.foo
end

在单元测试框架和功能测试框架中,此测试都失败了。我得到的失败看起来像:

1) Failure:
test_fixtures_equal?(FooUnitTest) [test/unit/foo_test.rb:53]:
<#<Foo id: 980190962, created_at: "2012-05-18 21:47:27", updated_at: "2012-05-18 21:47:27">>
with id <70029939109360> expected to be equal? to
<#<Foo id: 980190962, created_at: "2012-05-18 21:47:27", updated_at: "2012-05-18 21:47:27">>
with id <70029939309000>.

我做错了什么?如何获得指向相同对象的前向和后向指针?这对我来说特别重要,因为我试图同时修改两个对象并验证更改,但bar.foo链接没有看到“父”foo对象的更改,所以我的验证在测试期间失败。 / p> 唉,经过几个小时的搜索,我尝试了很多不同的方法,但我还是没能把它弄清楚。

谢谢!

2 个答案:

答案 0 :(得分:0)

简短回答:
  1.(似乎)夹具不理解'参考',它只知道'列名'。   2.在夹具中分配id有时候并不是一个坏主意

所以,更改你的灯具如下:

# foos.yml
one: 
  id: 1

# bars.yml
one:
  id: 1       # always assign the id
  foo_id: 1   # don't use:  foo: one

如果您不喜欢灯具,或者您的对象关联很复杂,请切换到'FactoryGirl'(https://github.com/thoughtbot/factory_girl

答案 1 :(得分:0)

简短版本:activerecord没有身份地图。

长版本:当您在2个位置加载相同的数据库行时,最终会得到2个单独的对象。与==相比,它们是相同的(因为活动记录定义为只比较id列),但在使用equal?时它们不相同。 (assert_equal使用==上次我使用了test / unit)。

在您执行bar.foos.first.bar之类的特定情况下,您可以在关联告诉轨道上指定inverse_of选项,这两个关联彼此相反。