Схема именования настраиваемых типов ActiveRecord

Я имею дело с таблицей, в которой уже есть столбец с именами естественного типа. Например. уже существует столбец с именем "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

Я все еще опасаюсь ударить еще несколько проблем в будущем. Это правильный способ сделать это?

7
задан ghempton 28 July 2011 в 22:05
поделиться