Ruby on rails 升级到Ruby 2.2后出现Rails 3 ActiveRecord#size方法错误
我使用的一个应用程序是Rails 3.2.18和Active Record 3.2.18。它使用的是Ruby 2.0.0,但是今天DevOps的人需要升级到Ruby 2.2.4。一旦用户开始在网站上创造流量,一切都开始爆炸。管理员甚至无法访问活动管理员 经过一段时间的深入研究,我意识到我被一个我经常看到的错误所抛弃:Ruby on rails 升级到Ruby 2.2后出现Rails 3 ActiveRecord#size方法错误,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,upgrade,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Upgrade,我使用的一个应用程序是Rails 3.2.18和Active Record 3.2.18。它使用的是Ruby 2.0.0,但是今天DevOps的人需要升级到Ruby 2.2.4。一旦用户开始在网站上创造流量,一切都开始爆炸。管理员甚至无法访问活动管理员 经过一段时间的深入研究,我意识到我被一个我经常看到的错误所抛弃: NoMethodError: undefined method `name' for nil:NilClass 因为我的一些模型有一个name属性,所以我认为这就是罪魁祸首 长话
NoMethodError: undefined method `name' for nil:NilClass
因为我的一些模型有一个name
属性,所以我认为这就是罪魁祸首
长话短说,问题在于对活动记录调用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\u实例。一些\u关系.count
将始终有效(尽管我确实理解count
和size
之间的区别)
我在这个问题上的发现出人意料地少。有一个相关的问题,但我不能证明这是我遇到的同一个问题
我现在要回滚升级到Ruby 2.2.4的版本,但我想知道是否有人能对此有所了解。Active Record 3.2.18和Ruby 2.2*之间是否存在缺陷?假设我需要升级到Ruby 2.2.4,那么这是升级Rails的唯一解决方案吗?这确实是Rails 3.2.18(以及一些其他补丁版本)和Ruby 2.2*之间的冲突。这是有案可查的
除了更新到受支持的Rails版本(这对于某些生产应用程序可能不是可行的解决方案)之外,Rails版本还可以更新到branch:
3-2-stable
您可能感兴趣您应该尝试移动到Rails 3-2-stable,看看问题是否仍然存在。另外,在大小/数量上也有细微的差别,为什么你想在这里显示大小?我很惊讶有这么多用户在评论中给出答案;)。我没有选择,也没有参与这个特殊应用程序的决策。我有点像第八个签约开发人员,今天就开始着手解决这个问题:)。另外,我几乎不认为“内存中的其他数据库查询”和“总是数据库查询”是一个细微的区别,事实上,这可能是促使原始开发人员选择size
而不是count
的主要区别。还要感谢@spickermann和@Anthony的帮助,对于我来说,通过websearch很难找到Github问题(可能是因为它太旧了)。我只是碰巧在你发表评论的同时发现了它。