我正在使用的应用程序是使用Rails 3.2.18和Active Record 3.2.18。它使用的是Ruby 2.0.0,但DevOps的某些人现在需要升级到Ruby 2.2.4。一旦用户开始在网站上交通,一切都开始爆炸。管理员甚至无法访问Active Admin。Rails 3升级到Ruby 2.2后的ActiveRecord #size方法错误
挖掘到这个相当长的一段时间后,我意识到我被错误我不断看到揭去:
NoMethodError: undefined method `name' for nil:NilClass
由于我的一些机型有name
属性,我认为这是罪魁祸首。
长话短说,问题是在调用size
上的一个活动记录has_many
关系尚未加载到内存中。下面是我如何在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吗?
你可能会对https://github.com/rails/rails/issues/18991#issuecomment-74886210 – spickermann
感兴趣,您应该尝试着移至rails 3-2 stable,看看问题是否仍然存在。此外,尺寸/数量也有细微的差异,为什么你要在这里尺寸? – Anthony
我很惊讶有多少SO用户在评论中发布答案;)。我没有选择或参与这个特定应用程序的决定。我有点像第八个开发人员要签约工作,只是今天就解决这个问题:)。此外,Id几乎不会将“内存中的其他数据库查询”与“总是数据库查询”称为“细微”差异,事实上,它可能是*主要*差异,它促使原始开发人员选择“大于”计数'。 – Todd