我正在使用的應用程序是使用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