我开发的一个应用程序正在使用 Rails 3.2.18 和 Active Record 3.2.18。它使用的是 Ruby 2.0.0,但 DevOps 的某个人今天需要升级到 Ruby 2.2.4。一旦用户开始在网站上产生流量,一切都开始爆炸式增长。管理员甚至无法访问 Active Admin。
在深入研究了一段时间后,我意识到我被一个经常看到的错误搞糊涂了:
NoMethodError: undefined method `name' for nil:NilClass
因为我的一些模型有一个 name
属性,我认为这是罪魁祸首。
长话短说,问题在于在尚未加载到内存中的 Active Record has_many
关系上调用 size
。以下是我如何在 Rails 的控制台中进行演示:
model_instance = MyModel.find(12345)
model_instance.some_relations.size
# the error from above will be thrown (nomethoderror on name: for nil)
model_instance.some_relations
model_instance.some_relations.size
# it works fine and produces expected output
此外,model_instance.some_relations.count
将始终有效(尽管我确实理解 count
和 size
之间的区别)。
我在这个问题上发现的很少。有相关GitHub issue here ,但我无法证明这是我遇到的相同问题。
我打算回滚我现在升级到 Ruby 2.2.4 的版本,但想知道是否有人可以对此有所了解。 Active Record 3.2.18 和 Ruby 2.2.* 之间是否存在错误?假设我需要升级到 Ruby 2.2.4,同时升级 Rails 是唯一的解决方案吗?
最佳答案
这确实是 Rails 3.2.18(以及其他一些补丁版本)和 Ruby 2.2.* 之间的冲突。已记录 here .
除了更新到受支持的 Rails 版本(这对于某些生产应用程序来说可能不是可行的解决方案)之外,Rails 版本可以更新到分支:3-2-stable
。
关于ruby-on-rails - 升级到 Ruby 2.2 后的 Rails 3 ActiveRecord #size 方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373398/