1

私はスーパークラスのワークアウトを持っています:

class Workout < ActiveRecord::Base
  SUBCLASSES = [WeeklyWorkout, DailyWorkout, OneTimeWorkout]
  (...)
end

そして、サブクラスのリストが必要です。各サブクラスは次のようになります。

class WeeklyWorkout < Workout
   (...)
end

したがって、 Workout クラスをロードすると、すべてうまくいきます。しかし、(Workout クラスを最初にロードせずに) サブクラスをロードしようとすると、循環依存関係に問題があります。例えば:

irb(main):062:0> ウィークリーワークアウト
RuntimeError: 定数 WeeklyWorkout のオートロード中に循環依存関係が検出されました
    from /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:460: in `load_missing_constant'
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:183:から`const_missing'に
    from /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:494:in `load_missing_constant'
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:183:から`const_missing'に
    from /home/pablo/rails/tobefit/app/models/workout.rb:2:in `'
    from /home/pablo/rails/tobefit/app/models/workout.rb:1:in `'
    from /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:423:in `load'
    from /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:423:in `load_file のブロック'
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:615:in `new_constants_in' から
    from /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:422:in `load_file'
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:323から:`require_or_load'で
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:462:から「load_missing_constant」で
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:183:から`const_missing'に
    from /home/pablo/rails/tobefit/app/models/workouts/weekly_workout.rb:1:in `'
    from /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:423:in `load'
    from /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:423:in `load_file のブロック'
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:615:in `new_constants_in' から
    from /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:422:in `load_file'
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:323から:`require_or_load'で
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:462:から「load_missing_constant」で
    /var/lib/gems/1.9.1/gems/activesupport-4.0.0/lib/active_support/dependencies.rb:183:から`const_missing'に
    から (irb):62
    from /var/lib/gems/1.9.1/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start'
    from /var/lib/gems/1.9.1/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start'
    from /var/lib/gems/1.9.1/gems/railties-4.0.0/lib/rails/commands.rb:64:in `'
    from bin/rails:4:in `require'
    from bin/rails:4:in `'

問題が発生する理由はわかっています。しかし、私はそれを修正する方法を理解できません。この問題を解決するためにこれを設計する方法を知っている人はいますか?

4

1 に答える 1

3

あなたが書くとき:

SUBCLASSES = [WeeklyWorkout, DailyWorkout, OneTimeWorkout]

さまざまなファイルを自動ロードします。(私はあなたがこれを知っていると思います。)

この問題を回避する 1 つの方法は、シンボルを使用することです。

SUBCLASSES = [:WeeklyWorkout, :DailyWorkout, :OneTimeWorkout]

次に、SUBCLASSES の要素にアクセスするときは、 を使用しますconst_get。これにより、サブクラス ファイルが親クラスのファイルと一緒に自動ロードされなくなります。

于 2013-10-19T18:41:51.300 に答える