Rails 3 升级到 Ruby 2.2 后的 ActiveRecord #size 方法错误

Rails 3 ActiveRecord #size Method Bug After Upgrade to Ruby 2.2

我开发的一个应用程序正在使用 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 将始终有效(尽管我确实理解 countsize 之间的区别)。

我在这个问题上发现的很少。有一个相关的 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