Rails: STI,继承和重装! 开发环境bug

创建于 2013-01-02  ·  3评论  ·  资料来源: rails/rails

我正在重新打开 issue #868,因为它今天仍然存在。

我用过 ruby​​-1.9.3-p362 和 rails 3.2.9

唯一的解决方案是要求子类或使用config.cache_classes = true

> Support.all
 => [] 
> Employee
 => Employee(id: integer, type: string) 
> Administrator
 => Administrator(id: integer, type: string) 
> Support.all
 => [#<Administrator id: 1, type: "Administrator">, #<Employee id: 2, type: "Employee">] 
activerecord

最有用的评论

这是在具有延迟加载类的开发模式下使用 STI 的已知限制。 您需要使用require_dependency使 Rails 知道这些子类,例如:

# app/models/support.rb
class Support < User
end

require_dependency 'administrator'
require_dependency 'employee'

如果你有很多这样的子类,那么你可以使用Dir[]app一个特殊文件夹来加载它们,例如:

# app/models/user.rb
class User < ActiveRecord::Base
end

Dir["#{Rails.root}/app/users/*.rb"].each do |file|
  require_dependency file
end

或者第三种选择是在Model.descendants对列表进行硬编码,例如:

# app/models/user.rb
class User < ActiveRecord::Base
  def self.descendants
    [Support, Administrator, Employee]
  end
end

我个人没有使用过最后一个,但它应该可以工作。

所有3条评论

我已经在 rails 4 上重现它

Rails 4.0.0. 测试版
红宝石 1.9.3p194

1.9.3p194 :001 > Administrator.create

1.9.3p194 :003 > Employee.create

1.9.3p194 :008 > Support.all
  Support Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."type" IN ('Support', 'Administrator', 'Employee')
 => #<ActiveRecord::Relation [#<Administrator id: 1, type: "Administrator">, #<Employee id: 2, type: "Employee">]> 

1.9.3p194 :009 > reload!
Reloading...
 => true 

1.9.3p194 :010 > Support.all
  Support Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."type" IN ('Support')
 => #<ActiveRecord::Relation []> 

这是在具有延迟加载类的开发模式下使用 STI 的已知限制。 您需要使用require_dependency使 Rails 知道这些子类,例如:

# app/models/support.rb
class Support < User
end

require_dependency 'administrator'
require_dependency 'employee'

如果你有很多这样的子类,那么你可以使用Dir[]app一个特殊文件夹来加载它们,例如:

# app/models/user.rb
class User < ActiveRecord::Base
end

Dir["#{Rails.root}/app/users/*.rb"].each do |file|
  require_dependency file
end

或者第三种选择是在Model.descendants对列表进行硬编码,例如:

# app/models/user.rb
class User < ActiveRecord::Base
  def self.descendants
    [Support, Administrator, Employee]
  end
end

我个人没有使用过最后一个,但它应该可以工作。

我有这种问题,无法正常工作。 我的模型是 A、B(及更多)<C、D(及更多)<B。
代码更改后,我得到“未初始化的常量 B”。 以几种方式尝试了 require_dependency,但并不真正知道 1)需要哪个类(B?),以及 2)在哪里做。
这些模型以多种方式与其他模型相关联,这也可能对加载顺序产生影响(例如 A 属于 X、X has_many Bs 和 Cs)

此页面是否有帮助?
0 / 5 - 0 等级