如何从父模型类调用before_save方法?

时间:2012-07-04 11:45:51

标签: ruby-on-rails mongodb inheritance model relation

我有两种模式:

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。

但正如你所看到的,游戏并不属于任何人。这就是我为所有游戏保留所有全局方法的地方。我永远不需要查询Teacher.games。相反,我只需要查询Teacher.puzzlesTeacher.riddles等等。

正因为如此,当我来到before_save方法并尝试拨打teacher时,它会失败,因为teacher与{{1}无关}。

那么如何让我的全局Game类处理这个方法并仍然引用它的子关联?

还..

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

另外..

我承认,我的协会可能存在建筑缺陷。有人会建议我直接使用gameGame创建两个关联,甚至只是一个关联。不确定会有什么好转或更糟。

2 个答案:

答案 0 :(得分:4)

如果每个游戏都有教师,belongs_to :teacher应该在Game课程中而不在子类中。

当您在before_save中添加Game并保存Puzzle时,它会从before_save致电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 

答案 1 :(得分:1)

Game之类的声音很适合您的游戏课程中包含的基于ActiveSupport::Concern Module的{​​{1}}:

# 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