2016-02-12 107 views
3

我正在使用的应用程序是使用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永远是可行的(虽然我明白countsize之间的差异)。

在这个问题上,我发现令人惊讶的很少。有一个相关的GitHub issue here,但我不能证明它是相同问题我有。

我现在要回滚我的发布升级到Ruby 2.2.4的版本,但想知道是否有人可以阐明这一点。 Active Record 3.2.18和Ruby 2.2之间是否存在缺陷?假设我需要升级到Ruby 2.2.4,唯一的解决方案是升级Rails吗?

+1

你可能会对https://github.com/rails/rails/issues/18991#issuecomment-74886210 – spickermann

+1

感兴趣,您应该尝试着移至rails 3-2 stable,看看问题是否仍然存在。此外,尺寸/数量也有细微的差异,为什么你要在这里尺寸? – Anthony

+0

我很惊讶有多少SO用户在评论中发布答案;)。我没有选择或参与这个特定应用程序的决定。我有点像第八个开发人员要签约工作,只是今天就解决这个问题:)。此外,Id几乎不会将“内存中的其他数据库查询”与“总是数据库查询”称为“细微”差异,事实上,它可能是*主要*差异,它促使原始开发人员选择“大于”计数'。 – Todd

回答

0

这确实是Rails 3.2.18(和其他一些补丁版本)和Ruby 2.2。*之间的冲突。它被记录在here

除了更新到受支持的Rails版本之外,Rails版本可能更新为分支:3-2-stable