2012-05-18 49 views
1

假設兩種型號:rails 3.1.3 has_many/belongs_to燈具不相等?

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對象的更改,所以我的驗證在測試期間失敗。

唉,經過幾個小時的搜索後,我嘗試了很多不同的方法,我一直無法弄清楚這一點。

謝謝!

回答

0

短版本:activerecord沒有標識映射。

長版本:當您在兩個地方加載相同的數據庫行時,最終會生成兩個單獨的對象。當與==比較時,它們是相同的(因爲活動記錄因此僅僅比較id列),但是在使用equal?時它們不相同。 (assert_equal使用==上次我使用了測試/單元)。

在特定情況下,如果您正在執行諸如bar.foos.first.bar之類的操作,則可以在關聯告知導軌上指定inverse_of選項,即2個關聯是彼此相反的。

+0

謝謝。這似乎與我想要的接近,除了一個細節: 有以下限制:inverse_of支持: *對於belongs_to關聯has_many反向關聯被忽略。 –

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

+0

對不起,這不起作用(我剛剛測試過)。固定裝置可以理解參考文獻。這些對象是相同的,但不一樣。即,assert_equal返回true,但assert_same返回一個錯誤。 (在使用引用之前,這是真的,當我使用ID號時是這樣) –