我定义了三个类,如下所示:

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正常工作!

为什么在珊瑚工作之前需要引用动物?顺便说一句,如果我正在执行all以外的操作,则行为相同。 Coral.class做同样的事情。

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

谢谢!

最佳答案

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

如果希望无论是否已加载Coral都调用FishAnimal,只需将它们放在文件models/coral.rbmodels/fish.rb中。那应该为您工作。

08-07 01:49