我正面临着STI(单表继承)的问题,其中一个回调应该仅在其中一个子模型的实例上运行,实际上也在其兄弟的实例上运行,即使它不应该。
class Parent < ApplicationRecord; end
class FirstChild < Parent
after_initialize :set_default_attr
private
def set_default_attr
self.attr = "something"
end
end
class SecondChild < Parent; end
second = SecondChild.new
assert_nil second.attr # Fails because it is set to "something"
我希望#set_default_attr
回调仅在FirstChild
个实例上运行,而不是在SecondChild
个实例上运行。我认为目前的行为是违反直觉的。我错过了什么吗?
Ruby版本:2.5.0,Rails版本:5.1.4
更新1:似乎传播验证
更新2:可能的解决方法是添加以下内容:
class FirstChild < Parent
after_initialize :set_default_attr, if: :type_is_first?
validate :attr, presence: true, if: :type_is_first?
private
def set_default_attr
self.attr = "something"
end
def type_is_first?
type == "FirstChild"
end
end
然而,这对我来说感觉非常脏。
答案 0 :(得分:0)
我的坏,我是从一个错误的阶级继承......