Rails STI兄弟回调传播

时间:2018-02-13 22:14:25

标签: ruby-on-rails ruby inheritance ruby-on-rails-5 sti

我正面临着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
然而,这对我来说感觉非常脏。

1 个答案:

答案 0 :(得分:0)

我的坏,我是从一个错误的阶级继承......