2

私は2つのモデルを持っています:

class Game
  before_save :update_teacher
    teacher
  end

  def update_teacher
    teacher.update_attribute("something", true)
  end
end

class Puzzle < Game
  belongs_to :teacher
end

私は多くの種類のゲームを持っています。ゲームが完成したら update_teacher したいと思います。

しかし、ご覧のとおり、ゲームは誰のものでもありません。これは、すべてのゲームのすべてのグローバル メソッドを保持する場所です。クエリを実行する必要はありませんTeacher.gamesTeacher.puzzles代わりに、クエリを実行するだけで済みますTeacher.riddles

このため、before_saveメソッドに来て を呼び出そうとすると、 が に関連付けられていないteacherために失敗します。teachergame

では、このメソッドを処理するグローバル Game クラスを維持し、その子の関連付けを引き続き参照するにはどうすればよいでしょうか?

また..

この before_save が実際には呼び出されない可能性があることに気付きました。これは、更新中の Game モデルではないためです (またはそうですか?)。同じ質問ではない場合、この継承されたメソッドを適切にグローバル化するにはどうすればよいですか?

あるいは..

私は、私の協会のやり方にアーキテクチャ上の欠陥があるかもしれないことを認めます。2 つのアソシエーションを作成することをお勧めします。何が良くなったり悪くなったりするのかわからない。Gamegame_type

4

2 に答える 2

4

すべてのゲームに教師がいる場合は、サブクラスではなくクラスbelongs_to :teacherに配置する必要があります。Game

に を追加before_saveしてGameを保存すると、 はゲームなのでからPuzzleを呼び出しますが、 の知識はありません。before_saveGamePuzzleGame:teacher

状況ではなく、達成したいことのより詳細な説明で質問を更新してください。

アップデート

あなたができることは、親クラスで呼び出され、子クラスによってオーバーライドされるメソッドを持つことです

class A
  before_save :do_x

  def do_x
    raise "Please implement this!"
  end
end

class B < A
   def do_x
     # do what B has to do
   end
end 
于 2012-07-04T12:07:28.137 に答える
1

あなたのゲームクラスに含まれているベースGameの良い候補のように聞こえます:ActiveSupport::ConcernModule

# app/models/concerns/game.rb
require 'active_support/concern'

module Game
  extend ActiveSupport::Concern

  included do
    belongs_to :teacher
    before_save :update_teacher
  end

  module InstanceMethods
    def update_teacher
      teacher.update_attribute("something", true)
    end
  end
end

# app/models/puzzle.rb
class Puzzle
  include Game
end

このようbelong_tobefore_save発送されたPuzzleGameに同梱されます。

于 2012-07-04T12:05:13.553 に答える