我有三个类定义如下:
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
做同样的事情。
我在实际应用程序中没有看到这种行为,但我担心这是一个奇怪的错误等待发生。
谢谢!
答案 0 :(得分:4)
Rails在调用时动态加载模型。因此,当您第一次调用Animal.all
时,您告诉Rails找到models/animal.rb
文件并将其加载 - 您的其他类也会在此时加载。
如果您希望能够拨打Coral
和Fish
,无论是否已加载Animal
,只需将其放入models/coral.rb
和{{}}文件中即可{1}}。这应该适合你。