2010-07-06 1 views
1

У нас есть модели, как Поставщиком, Дистрибьютор, Vendor, Покупатель в нашей схеме. Эти объекты имеют некоторые общие атрибуты (например, имя, описание, офисы продаж и т. Д.), Но в основном у них есть расходящаяся схема с различными has_many: через ассоциации (у поставщика много ресурсов, но нет других), из-за чего их нужно было свернуть на отдельные модели.Полиморфная абстракция моделей и потенциала MI в рельсах?

У нас также есть различные типы событий в системе, например, событие партнерства, событие дистрибьюторские, событие закупок и т.д.

Как я могу создать is_a отношения и абстрактные эти покупателей, продавцов и т. д. в модель компании и при создании мероприятия, например, как партнерское мероприятие, просто скажите, что компания 1 сотрудничает с компанией 2, не беспокоясь о том, что такое тип компании, так что я могу сделать что-то подобное в моей форме для представления события:

<p> 
    <%= f.label "Company 1" %> 
    <%= f.collection_select :partnering_company_id_1, Company.all ,:id, :name, { :default => true} %> 
    </p> 

Я хочу поделиться более подробной информацией о схеме в случае ее необходимости. Это возможно? Недавно я столкнулся с this блога, который идет дальше и описывает MTI, но я не уверен, применим ли это к текущему запросу проблемы.

ответ

0

Я бы использовал одиночное наследование таблицы. Я считаю, что это лучшее решение, когда у вас есть модели с очень похожими атрибутами.

Для Events, например, у вас будет только одна таблица (events), которая должна иметь столбец type.

Там нет хорошей документации об ИПППАХ (по крайней мере я не нашел), но this поста и this нужно немного помочь ...

+0

Не слишком увлечен ИППП, так как только модели разделяют несколько атрибутов общих и имеют их собственный has_many: через ассоциации. Также каждая из этих моделей, вероятно, будет доступна с помощью sphinx отдельно. – papdel

+0

У вас может быть много моделей. Дело в STI заключается в том, что у вас будет только одна таблица. Но если ваши модели не обладают многими атрибутами, это не лучшее решение. –

0

Я не знаю, если это по-прежнему актуально, но я недавно работал над решением MTI. Это мега простой и прекрасно работает, кажется, что именно то, что вам нужно (под ред) :)

Рассмотрим придав ему вид: http://peterhamilton.github.com/citier