2012-07-04 32 views
1

我有两个型号:如何从父模型类调用before_save方法?

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.games。相反,我只需要查询Teacher.puzzlesTeacher.riddles等等。

正是因为如此,当我来到before_save方法,我尝试调用teacher,它会失败,因为teacher不与game有关。

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

还..

我才意识到,这可能before_save实际上不能被调用,因为它不是真实更新游戏模式(是吗?)。如果不是这个问题,我该如何正确地全球化这种继承的方法?

或者..

我承认,有可能是一个建筑的缺陷,以我怎么回事我的关联。有人建议我创建两个协会,甚至只是一个协会从Game直接与game_type。不知道什么会更好或更糟。

回答

3

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

当您添加在Game一个before_save并保存Puzzle它会调用从Gamebefore_save因为Puzzle是一个游戏,但Game已经没有:teacher knowlege。

请更新您的问题,更详细地描述您想要完成的事情,而不是情况。

UPDATE

你可以做什么,是有一个被称为父类,由子类

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 
+0

有趣的覆盖方法。你说他们俩应该和老师有关系。但是在思考DRY实践时,这给了我红色的信号。也许我应该使用'has_many:'游戏'关系来处理'Puzzles'? – Trip

+0

@Trip我不认为我可以肯定地说任何事情,不知道你的游戏/教师/益智的架构如何。这就是为什么我问这个问题的最新情况,包括:) – Draiken

+0

@Trip更新了您可能想要使用的另一种方法的答案。但是我不知道游戏/拼图/老师之间的关系是什么 – Draiken

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当包括Game发送到Puzzle