2013-01-07 29 views
3

我有三个类定义如下:单个表继承子类未知

class Animal < ActiveRecord::Base 
    attr_accessible :animal_definition_id, :aquarium_id 

    belongs_to :animal_definition 
    belongs_to :aquarium 

    has_many :comments, as: :commentable 
end 

class Fish < Animal 
end 

class Coral < Animal 
end 

如果我火了一个控制台和类型:

Coral.all 

我得到:

NameError: uninitialized constant Coral 
    from (irb):1 
    from /Users/gjr/.rvm/gems/[email protected]/gems/railties-3.2.10/lib/rails/commands/console.rb:47:in `start' 
    from /Users/gjr/.rvm/gems/[email protected]/gems/railties-3.2.10/lib/rails/commands/console.rb:8:in `start' 
    from /Users/gjr/.rvm/gems/[email protected]/gems/railties-3.2.10/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

现在...如果我键入Animal.all它按预期工作。然后Coral.all工作正常!

为什么动物需要在珊瑚工作之前参考?顺便说一句,如果我正在做的事情不是all,那也是一样的行为。 Coral.class做同样的事情。

我在实际的应用程序中没有看到这种行为,但我担心它会发生一个奇怪的错误。

谢谢!

回答

4

Rails在调用它们时动态加载它的模型。所以当你第一次打电话给Animal.all时,你告诉Rails去找models/animal.rb文件并加载它 - 当时你的其他类也会被加载。

如果你想能够调用CoralFish无论Animal已经或没有被加载,只是把它们放在文件models/coral.rbmodels/fish.rb。这应该适合你。