Многотабличное наследование Rails и полиморфные ассоциации

В настоящее время я разрабатываю приложение с использованием Rails 3.2 и столкнулся с небольшой проблемой. Я знаю, что об этом уже спрашивали сотни раз, но я не смог найти ответ, который решил бы эту проблему. Вот похожий ER: http://i.stack.imgur.com/x5V0G.png

Довольно очевидно, что я пытаюсь сделать. Я надеюсь, что ассоциация будет выглядеть следующим образом:

Supplier.first.theatres.first.events.first.orders
TourEvent.first.orders
Tour.first.orders

Теперь было бы неплохо иметь возможность определять мои модели так:

class Event < ActiveRecord::Base
  has_many :orders
  belongs_to :eventable, polymorphic: true

  # id, eventable_id, eventable_type, title, date, price
end

class TourEvent < Event
  belongs_to :tour

  # id, tour_id, rendezvous, guide_name
end

class Tour < ActiveRecord::Base
   has_many :events, class_name: 'TourEvent'

  # id, name, venue, duration
end

Но я понимаю, что это зарезервировано для «STI», а не для «MTI». Есть идеи, как заставить мое решение работать без сложных миксинов или плагинов? Или это просто невозможно?


person ollym    schedule 29.02.2012    source источник


Ответы (1)


Я думаю, вы можете сделать что-то вроде этого:

suppliers 
has_many :events

events
belongs_to :suppliers
belongs_to :institutions
has_many :orders
# id, supplier_id, institution_id, ...

institutions
# id, type, title, ...
types: theatre, club, tour

orders
belongs_to :events
# id, event_id

Затем вы можете получить доступ к заказам событий:

Supplier.first.events.first.orders
person ryaz    schedule 29.02.2012
comment
Извините - я не думаю, что вы понимаете проблему. Я еще немного почитал и считаю, что прав, говоря, что в настоящее время невозможно сделать Multiple-Table-Inheritance изначально в Rails 3.2.1 (пока!). Было бы хорошим дополнением. - person ollym; 29.02.2012
comment
Как я вижу на картинке i.stack.imgur.com/x5V0G.png вы хотите хранить в БД поставщиков, заказы и события. Мероприятие принадлежит учреждению (например, театру или клубу). Зачем вам нужны дополнительные таблицы, такие как theather_events или club_events? Зачем нужна таблица для каждого заведения? - person ryaz; 29.02.2012
comment
каждое «учреждение» хранит разную информацию. Мне важно это различать. - person ollym; 29.02.2012
comment
Таблица вашего учреждения будет STI. Вы можете создавать модели для каждого типа учреждения. - person ryaz; 01.03.2012