单表继承子类未知,直到引用super

时间:2013-01-07 01:13:39

标签: ruby-on-rails-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/ruby-1.9.3-p125@WebDev/gems/railties-3.2.10/lib/rails/commands/console.rb:47:in `start'
    from /Users/gjr/.rvm/gems/ruby-1.9.3-p125@WebDev/gems/railties-3.2.10/lib/rails/commands/console.rb:8:in `start'
    from /Users/gjr/.rvm/gems/ruby-1.9.3-p125@WebDev/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工作正常!

为什么在Coral工作之前需要引用Animal?顺便说一下,如果我正在做all之外的其他事情,那么行为也是如此。 Coral.class做同样的事情。

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

谢谢!

1 个答案:

答案 0 :(得分:4)

Rails在调用时动态加载模型。因此,当您第一次调用Animal.all时,您告诉Rails找到models/animal.rb文件并将其加载 - 您的其他类也会在此时加载。

如果您希望能够拨打CoralFish,无论是否已加载Animal,只需将其放入models/coral.rb和{{}}文件中即可{1}}。这应该适合你。