新手问题 升级 rails4 碰到的问题 (STI)

wym205 · 2014年03月11日 · 最后由 wym205 回复于 2014年03月11日 · 2150 次阅读

最近尝试把公司的项目升级到 rails 4 去,结果就各种蛋疼了 有一张 STI 表上的的错误不知道怎么办了,求各路大神指点啊 目录结构

+-- Models |---+-- gacha.rb |---+-- gacha |------+-- a.rb |------+-- a |----------+-- b.rb |----------+-- b |--------------+-- d.rb |----------+-- c.rb |----------+-- c |--------------+-- d.rb |----------+-- d.rb

gacha.rb

class Gacha < ActiveRecord::Base
end

a.rb

class Gacha::A < Gacha
end

b.rb

class Gacha::A::B < Gacha::A
end

b/d.rb

class Gacha::A::B::D < Gacha::A::B
   include Gacha::A::D
end

c.rb

class Gacha::A::C < Gacha::A
end

c/d.rb

class Gacha::A::C::D < Gacha::A::C
   include Gacha::A::D
end

d.rb

module Gacha::A::D
   def is_d?
       true
   end
end

上面的代码在 3.2.16 里面还没事,一升级到 4 就报错了:Gacha::A::B::D 和 Gacha::A::C::D 只能认识一个,第二个就会报 NoMethodError: undefined method ‘decorate_columns' for Gacha::A::D:Module 也就是说第二个变成了 Module 而不是正常的 Gacha 类,试了一下把 Module 的名称换一下就没事 (Gacha::A::D => Gacha::A::X 之类的,不和 b/d.rb,c/d.rb 中的 D 重名就没事),不过总归是不爽,有什么彻底的解决方法吗?

“STI”只是占用了 type 字段。。一个简单的类继承即可。。。

是类继承,只是逻辑有点复杂所以用了几层的类继承,现在是就不知道有没有在尽量不更改代码的情况下可行的方法。 比如有两条数据

#<Gacha::A::B::D id: 1, type: "Gacha::A::B::D">
#<Gacha::A::C::D id: 2, type: "Gacha::A::C::D">

rails 3 下

Gacha.find 1
#<Gacha::A::B::D id: 1, type: "Gacha::A::B::D">
Gacha.find 2
#<Gacha::A::C::D id: 2, type: "Gacha::A::C::D">

都没事, 到了 rails4 里面

Gacha.find 1
#<Gacha::A::B::D id: 1, type: "Gacha::A::B::D">
Gacha.find 2
NoMethodError: undefined method `decorate_columns' for Gacha::A::D:Module

凌乱了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号