Rails STI:如何更改"类型"列的类名和值之间的映射

aru*_*run 14 types ruby-on-rails single-table-inheritance sti

由于公司规则,我不能使用我们的域名类; 我打算用一个类比来代替.我有一个名为projects的表,其中有一个名为'type'的列,可能的值为'indoor'和'outdoor'.室内和室外的记录具有明显的功能分离,并且作为STI实现非常巧妙地适合.不幸的是,我无法更改类型名称,也无法在全局命名空间中添加类.有没有办法为'type'指定不同的值?

注意:我不是要为STI使用不同的列名而不是'type'.我希望除了我的类名之外,还有不同的类型值.

小智 18

你可以尝试这样的事情:

class Proyect < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)

然后是室内课,但有其他名字

class Other < Proyect
  class << self
    def find_sti_class(type_name)
      type_name = self.name
      super
    end

    def sti_name
      "Indoor"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

同样适用于户外课程.您可以在http://apidock.com/rails/ActiveRecord/Base/find_sti_class/class中查看sti_name

  • 请注意,您使用此方法,通过基类找到的对象将实例化为基类,而不是子类.例如,Proyect.new(类型:'Other')将返回Proyect类型的对象,其属性为:type设置为'Other'.而默认行为是返回已经转换为Other类型的对象. (3认同)
  • `find_sti_class`覆盖不应该转到基类? (2认同)