3

次のように定義された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うまくいきます!

サンゴが機能する前に動物を参照する必要があるのはなぜですか?ちなみに、私が。以外のことをしている場合も同じ動作ですallCoral.class同じことをします。

私は実際のアプリケーションでこの動作を見たことがありませんが、奇妙なバグが発生するのを待っているのではないかと心配しています。

ありがとう!

4

1 に答える 1

4

Railsは、呼び出されたときにモデルを動的にロードします。したがって、最初に電話をかけるAnimal.allと、Railsにファイルを見つけてmodels/animal.rbロードするように指示します。そのときに、他のクラスもロードされます。

CoralロードされているかどうかにFish関係なく、呼び出すことができるようにしたい場合は、ファイルとAnimalに入れてください。それはあなたのために働くはずです。models/coral.rbmodels/fish.rb

于 2013-01-07T05:35:03.650 に答える