Я имею дело с таблицей, в которой уже есть столбец с именами естественного типа. Например. уже существует столбец с именем "provider", который имеет значения "foo" или "bar". Я хочу использовать STI в этой таблице, используя существующие имена типов , так как кажется глупым добавлять дополнительный столбец под названием «тип» для использования Active Record. Проблема в том, что имена этих типов не совсем соответствуют классам ruby. Я надеялся, что смогу настроить собственное сопоставление, например Class1 => foo, Class2 => bar.
Я пробовал следующее:
# In the base class
set_inheritance_column :provider
# In Class1
def self.sti_name
'foo'
end
# In Class2
def self.sti_name
'bar'
end
Но, похоже, это не помогает, я получаю:
The single-table inheritance mechanism failed to locate the subclass: 'foo'
...
activerecord (3.0.8) lib/active_record/base.rb:923:in `find_sti_class'
Похоже, ActiveRecord может обрабатывать только полные имена классов и демодуляризованные имена классов. Я не уверен, для чего вообще нужен защищенный метод sti_name.
Я собираюсь углубиться в структуру и переопределить ActiveRecord :: Base.compute_type. До того, как я это сделаю, кто-нибудь делал это раньше? Это погоня за дикими гусями?
Могут ли рельсы обрабатывать имена пользовательских типов, или я застрял с именами классов Ruby?
Обновление
Я получил это, чтобы работать:
# In the base class
def self.find_sti_class(type_name)
# Do mapping from foo/bar to Class1/Class2
...
end
Я все еще опасаюсь ударить еще несколько проблем в будущем. Это правильный способ сделать это?