2012-01-31 65 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的多个实例。