2014-09-10 1 views
1

Я хочу иметь два слоя STI. Первый слой работает, но я не уверен, как перенести первую модель в другую таблицу, используя STI. Пример:Как реализовать STI (в Rails) в справочной таблице?

class Instrument < ActiveRecord::Base 

end 

class Guitar < Instrument 

end 

class Piano < Instrument 

# and so on... 

Ok. Но я хочу, чтобы отслеживать категории инструментов, так что я могу сказать, их тип:

class InstrumentType < ActiveRecord::Base 

end 

class StringInstrumentType < InstrumentType 

end 

# etc. 

Итак ... наша модель гитары становится:

class Guitar < Instrument 
    belongs_to :string_intrument_type 
end 

class StringInstrumentType < InstrumentType 
    has_many :guitars 
end 

Как это реализовать? Что я могу назвать столбцом внешнего ключа и как я могу указать Rails/AR, что делать?

Как я отступаю от базы здесь?

Этот сценарий изобретен, но мы находим, что в реальном мире рефакторинг хочет, чтобы мы двигались в этом направлении.

ответ

0

Ваш первый ИППП имеет смысл, другой - нет. На абстрактном уровне строки скорее являются экземпляром InstrumentType, а не его подкласса. Мне кажется, что вы, скорее всего, будете использовать sth like:

class Instrument < ActiveRecord::Base 
    # abstract 
end 

class StringInstrument < Instrument 
    # abstract 
end 

module Instrument::Keyboard 
end 

class Guitar < StringInstrument 
end 

class Piano < StringInstrument 
    include Instrument::Keyboard 
end 

или аналогичный. Очевидно, это зависит от вашего реального кода. В примере, который вы дали, типы инструментов довольно постоянны во времени, поэтому можно использовать наследование.

Мое предположение, однако, что ваши типы являются динамическими и могут быть добавлены клиентами. То, что вы ищете, вероятно, является древовидной структурой. Таким образом, у каждого типа есть родительский элемент, и каждый родительский тип может иметь пару детей. Затем вы можете просто сделать Instrument belongs_to instrument_type и указать на дерево инструментов InstrumentType.