【问题标题】:Rails models reloaded mid-request resulting in AssociationTypeMismatchRails 模型在请求中重新加载导致 AssociationTypeMismatch
【发布时间】:2013-04-27 13:32:36
【问题描述】:

当我们在开发模式下运行时,我们在 Rails 3.1 中遇到了问题。似乎我们的模型有时会在请求中重新加载,并且在我们模型的类上设置了一个新的 object_id。然后导致 ActiveRecord::AssociationTypeMismatch

ActiveRecord::AssociationTypeMismatch Character(#2194222580) 预期, 得到字符(#2185863000)

如果我们将config.cache_classes = true 转为development.rb,问题似乎就消失了,但这样开发是不现实的,因为我们必须不断地重新启动我们的服务器。

任何人都知道为什么模型可能会在请求中重新加载,或者是否有一种方法可以强制缓存持续整个请求?

【问题讨论】:

  • 尝试 active_reload gem,它缓存模型,并在开发模式下完成任何更改时过期。我不知道为什么它会更改运行时间。你可以尝试让我知道上一个问题的帮助
  • 我认为它看起来很有效,我们现在在 rails 3.1 上,显然 active_reload 默认包含在 rails 3.2 中。始终如一地重现有点困难,但如果它看起来在几天后消失了,我会更新这个问题。
  • 不幸的是,active_reload 不起作用。虽然我们可能没有正确配置它
  • 只是想知道,你有没有调用 'load' 或 'require_dependency' 而不是 'require' ?
  • 这可能是一个愚蠢的建议,但你有没有在你的模型上打过猴子补丁,或者你的控制器或视图中需要任何文件。根据ActiveRecord::AssociationTypeMismatch,如果您的类被重新加载,而是在关联意外的对象类型时不应该发生这种情况。您的关联是否有可能被任何东西改变?

标签: ruby-on-rails activerecord


【解决方案1】:

如果 config.cache_classes = false,对模型的任何更改都会导致重新加载。这包括定义/重新定义模型中定义/已知的常量。

我们在使用 rspec 和 ActsAsFu 时遇到了这个问题。在测试期间重新定义 Fu 类导致相关(甚至间接相关)类重新加载,并且我们在相关对象上得到 ActiveRecord::AssociationTypeMismatch 错误。我们认为这是我们的,因为我们有单独运行良好的测试,但在其他测试之后运行时失败。我们的解决方案是为每个配置创建单独命名的 Fu 类,并避免在测试期间重新分配类名。

所以我的建议是确保您没有重新定义您的 Character 类已知的任何常量(或您的 Character 类已知的类等)

【讨论】:

  • 这似乎只是@stuartc 解释的不同部分。 (即猴子补丁重新定义模型定义,或相关模型的定义。)相同的机制...更改模型中间测试强制级联重新加载。
【解决方案2】:

过去我发现重新打开(猴子修补)ActiveRecord 模型实际上会从上到下重新加载整个类。尝试在您的代码库中搜索多个class Character 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多