2012-01-31 64 views
7

我們在開發模式下運行時遇到了Rails 3.1中的問題。看起來我們的模型有時會重新加載中間請求,並且在模型的類上設置了新的object_id。然後導致預期的一個ActiveRecord :: AssociationTypeMismatchRails模型重新加載中請求導致AssociationTypeMismatch

的ActiveRecord :: AssociationTypeMismatch字符(#2194222580), 了字符(#2185863000)

如果我們把development.rbconfig.cache_classes = true問題似乎走但是,像這樣開發是不現實的,因爲我們必須不斷地重新啓動我們的服務器。

任何人都有一個想法,爲什麼模型可能會重新加載中請求,或者如果有一種方法,我們可以強制緩存持續通過整個請求?

+1

嘗試active_reload gem它緩存模型,並在開發模式下完成任何更改時過期。我不知道它爲什麼會更改運行時間。可以嘗試讓我知道對最後一期的幫助 – Amar 2012-01-31 17:41:56

+0

我認爲,就像它正在工作,我們現在在rails 3.1上,顯然在rails 3.2中默認包含active_reload。 一致複製有點難,但如果看起來好像在幾天後就會更新這個問題。 – aproctor 2012-02-01 16:46:32

+0

不幸的是,active_reload無法正常工作。雖然我們可能沒有正確配置 – aproctor 2012-02-06 21:47:45

回答

1

對於config.cache_classes = false,對模型的任何更改都會導致重新加載。這包括定義/重新定義模型中定義的/已知的常數。

我們有使用rspec和ActsAsFu的這個問題。在測試過程中重新定義Fu類導致相關(甚至間接相關)類重新加載,並且我們在相關對象上得到了ActiveRecord :: AssociationTypeMismatch錯誤。我們認爲這是因爲我們的測試單獨運行良好,但在其他測試後運行時失敗。我們的解決方案是爲每個配置創建分別命名的Fu類,並避免在測試過程中重新分配類名。

所以我的建議是要確保你是不是重新定義

+1

這似乎只是@ stuartc的解釋中的一個不同部分。 (即猴子補丁重新定義了模型定義,或者相關模型的定義)。 相同的機制...更改模型中間測試強制級聯重新加載。 – 2012-11-27 18:52:50

0

知道您的字符類中的任何常數(或已知的已知到Character類的類,等等)。在過去,我發現,重新開放(猴子補丁)一個ActiveRecord模型實際上會從上到下重新加載整個類。嘗試在您的代碼庫中搜索class Character的多個實例。