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

我有很多类型的游戏。当任何游戏完成时,我想更新_teacher。

但正如你所见,Game 不属于任何人。它只是我为所有游戏保存所有全局方法的地方。我永远不需要查询Teacher.games。相反,我只需要查询Teacher.puzzles,或Teacher.riddles等等。

正因为如此,当我来到before_save方法时,我尝试调用teacher,它会失败,因为与 .teacher没有关联game

那么我怎样才能让我的全局 Game 类处理这个方法并且仍然引用它的子关联呢?

还..

我刚刚意识到这个 before_save 可能实际上不会被调用,因为它不是更新的游戏模型(或者它是?)。如果不是......同样的问题,我如何正确地全球化这个继承的方法?

或者..

我承认我的协会可能存在架构缺陷。有人会建议我创建两个关联,甚至直接从一个. 不知道什么会更好或更坏。Gamegame_type

4

2 回答 2

4

如果每场比赛都有老师,则belongs_to :teacher应该在Game班级而不是子班级。

当您before_save在其中添加 aGame并保存 aPuzzle时,它会before_save从 the中调用,Game因为Puzzle是游戏,但Game不了解: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被发送到Puzzle何时Game被包括在内。

于 2012-07-04T12:05:13.553 回答