Вы можете переопределить методы, которые 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
Я написал пост , в котором это более подробно описано.