Rails STI命名空间类,不使用类型列

时间:2016-07-25 08:59:43

标签: ruby-on-rails ruby ruby-on-rails-4

我正在尝试按如下方式实施STI

module ModuleName
  class ParentName
    self.inheritance_column = 'column_name'
  end
end

module ModuleName
  class ChildName < ModuleName::ParentName
    class << self
      def find_sti_class(type_name)
        type_name = self.name
        super
      end

      def sti_name
        self.name.sub(/^.*:/,"")
      end
    end
end

当我尝试

ModuleName::ChildName.create(column_name: 'ChildName')

我收到以下错误

ActiveRecord::SubclassNotFound: Invalid single-table inheritance type: ChildName is not a subclass of ModuleName::ChildName

我试图参考这里提供的解决方案 Rails STI: How to change mapping between class name & value of the 'type' column

任何帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:0)

module ModuleName
  class ParentName
    self.inheritance_column = 'column_name'
  end
end

module ModuleName
  class ChildName << ParentName
    # ...
  end
end

当您在模块中声明一个类时,它会自动将超类解析为同一个模块。

因此,使用ChildName << ModuleName::ParentName会尝试解析ModuleName::ModuleName::ParentName。如果要显式声明超类,可以使用::ModuleName::ParentName

答案 1 :(得分:0)

我正在做的错误是在创建ChildName时指定继承列。

错误: -

ModuleName::ChildName.create(column_name: 'ChildName')

右: -

ModuleName::ChildName.create() 

它会自动将column_name设置为&#39; ChildName&#39; 指定它将使rails认为ChildName是父类,并将查找名为ChildName的子类