我有两种模式:
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.puzzles
或Teacher.riddles
等等。
正因为如此,当我来到before_save
方法并尝试拨打teacher
时,它会失败,因为teacher
与{{1}无关}。
那么如何让我的全局Game类处理这个方法并仍然引用它的子关联?
还..
我刚刚意识到这个before_save可能实际上并没有被调用,因为它不是正在更新的游戏模型(或者是它?)。如果它不是......同样的问题,我如何正确地全球化这个继承的方法?
另外..
我承认,我的协会可能存在建筑缺陷。有人会建议我直接使用game
从Game
创建两个关联,甚至只是一个关联。不确定会有什么好转或更糟。
答案 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_to
和before_save
会在Puzzle
被包含时发送到Game
。