Rails单表继承

时间:2009-07-09 14:57:38

标签: ruby-on-rails single-table-inheritance

对于单表继承,如何强制Rails为'type'列使用整数列而不是字符串?

2 个答案:

答案 0 :(得分:1)

您可以覆盖Rails用于将表名转换为类名的方法,反之亦然:

相关方法是find_sti_class,它负责将存储在类型列中的值转换为相应的ActiveRecord模型和sti_name,它负责在给定ActiveRecord的情况下检索存储在类型列中的值。子类。

您可以像这样覆盖它们:

class Institution::Base < ActiveRecord::Base

  ALLOWED_CLASSES = %w[Institution::NonProfit Institution::Commercial]

  class << self

    def find_sti_class type_name
      idx = type_name.to_i
      super if idx == 0
      ALLOWED_CLASSES[idx-1].constantize
    rescue NameError, TypeError
      super
    end

    def sti_name
      idx = ALLOWED_CLASSES.index(self.name)
      if idx.nil?
        super
      else
        idx + 1
      end
    end

  end

end

我已经写了一篇post详细说明了这一点。

答案 1 :(得分:0)

您必须找到负责处理“类型”列的ActiveRecord部分并对其进行修补,即覆盖它在您的应用程序中的工作方式。