【问题标题】:Rails 2 -> Rails 3 upgrade fails with complaints about associationsRails 2 -> Rails 3 升级失败,抱怨关联
【发布时间】:2023-11-21 11:00:01
【问题描述】:

我已经为这个问题苦苦挣扎了一段时间,但我无法处理它。

我有一个在 Rails 2.3.18/ruby1.8.7 上运行良好的网站

我正在尝试将其导入 Rails3。我已经按照指南完成了视图更新(使用 rails_xss)。我现在正试图让测试套件通过并遇到以下奇怪的问题:

/Users/jon/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord-3.0.20/lib/active_record/reflection.rb:71:
in `reflect_on_association': undefined method `[]'   
for #<ActiveRecord::Reflection::AssociationReflection:0x00000100b607a0> (NoMethodError)
from  /Users/jon/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/activerecord- 3.0.20/lib/active_record/autosave_association.rb:138:in `has_many'
from /projects/mau/app/models/studio.rb:7:in `<class:Studio>'
from /projects/mau/app/models/studio.rb:3:in `<top (required)>'
...
from /Users/jon/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.0.20/lib/rails/application.rb:134:in `initialize!'
from /Users/jon/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.0.20/lib/rails/application.rb:77:in `method_missing'
from /projects/mau/config/environment.rb:5:in `<top (required)>'
from /projects/mau/spec/spec_helper.rb:3:in `require'
from /projects/mau/spec/spec_helper.rb:3:in `<top (required)>'

看似相关的代码位是我的Studio 模型有许多artists。而Artist 模型源自User

class Studio < ActiveRecord::Base
  has_many :users
  ...
end

class Artist < User
  ...
end 

class User < ActiveRecord::Base
  belongs_to :studio
  ...
end 

我在项目中仍然有 restful_authentication 并计划将其删除,但希望在运行测试套件后我能做到这一点。在这一点上,我无法运行 rails 任何东西,因为一旦我访问这些有问题的对象之一,事情就会失败。

我已经考虑升级 ruby​​ (1.9.3),但仍然遇到同样的问题。

我已经深入研究了调试器,但找不到任何相关内容。

我尝试使用完整的类名和外键指定 belongs_to/has_many 关系 - 没有区别。

我尝试了从 3.0.1 到 3.0.20 的不同版本的 Rails 3.0.x。没有效果。同样的问题。

我已经为 has_manybelongs_to 符号尝试了所有复数和单数组合。

最糟糕的是,我在不同的对象上还有一些其他关系,这些关系似乎很愉快地设置了。它们不涉及User 模型,这让我担心它是restful_authentication 位。

我一辈子都搞不清楚到底是什么。如果有人有任何想法或以前看过这个,我很乐意提供帮助。

我正在尝试进入 Rails 3.0.20,目的是从那里向前滚动到 3.1,然后是 3.2。在我进一步推进之前,我真的很想在 3.0.20 上获得一个半稳定版本。

在此先感谢您提供任何提示/技巧 罗杰斯先生

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord upgrade


    【解决方案1】:

    我找到了问题的根源。

    对于旧版本(Rails 2.3.18),我使用的是has_many_polymorphs。这个插件不再对 Rails3 有效。我在这里升级到“Rails 3 兼容版本”https://github.com/jystewart/has_many_polymorphs,它与 Rails 3.2 兼容,但不兼容 3.0。此 gem 中的代码修补了 ActiveRecord::Reflection::ClassMethods。该补丁不符合 Rails 3.0.x 建立关联的方式。

    我想是时候转移到ActiveRecord's native :polymorphic 支持了。

    【讨论】: