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

标签 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。一旦用户开始在网站上产生流量,一切都开始爆炸式增长。管理员甚至无法访问 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

关于ruby-on-rails - 升级到 Ruby 2.2 后的 Rails 3 ActiveRecord #size 方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35373398/

相关文章:

ruby-on-rails - rails : delayed_job on an after_create callback?

ruby-on-rails - Rails - 您要查找的页面不存在(在 Heroku 推送之后)

ruby-on-rails - rails : :save returns NoMethodError

javascript - 如何使用初始化的模型作为模式打开的唯一标识符?

ruby-on-rails - 在 Rails 中,对象是否应该仅限于具有 View 和 Controller 的对象?

sql - Rails with postgres - activerecord 查询 : sort by column ASC, 然后按列分组

ruby-on-rails - 有哪些你在 Rails 中不能做但可以在其他框架中做的事情?

ruby-on-rails - 在 Ruby 中使用集合比较两个哈希数组

ruby-on-rails - 在 session 中临时存储回形针对象

ruby-on-rails - 运行 rails server 时 Windows 上没有 Javascript 运行时