Я работаю над проектом (Rails 3.0.3), где я думаю, что мне может понадобиться использовать STI, но я не уверен, должен ли я просто добавить дополнительный столбец в таблицу и покончить с этим.
В моей объектной модели (для игровой системы) у меня есть игроки (которые принадлежат агентствам) и владельцы (которые владеют агентствами).
Оба игрока и владельцы принадлежат агентам, которые являются учетной записью пользователя, поэтому агент может быть игроком и / или владельцем во многих агентствах.
Вместо этого я должен был назвать агента «пользователь», упс.Итак, у меня есть следующее:
class Agency < ActiveRecord::Base
has_many :players, :class_name => "Player", :foreign_key => "agency_id"
has_many :agents, :through => :players, :source => :agent_id
has_one :owner, :class_name => "Owner", :foreign_key => "agency_id"
end
class Player < ActiveRecord::Base
belongs_to :agency, :class_name => "Agency", :foreign_key => "agency_id"
belongs_to :agent, :class_name => "Agent", :foreign_key => "agent_id"
end
class Owner < ActiveRecord::Base
belongs_to :agency, :class_name => "Agency", :foreign_key => "agency_id"
belongs_to :agent, :class_name => "Agent", :foreign_key => "agent_id"
end
Игрок и Владелец имеют одинаковые атрибуты, единственное различие между ними заключается в том, что Владелец имеет разные отношения с Агентством, чем Игрок (Владелец владеет Агентством,Агентство имеет только одного Владельца, но имеет много игроков).
Кроме того, Владельцу предоставляются особые права, такие как возможность настройки параметров в агентстве.
С точки зрения чистого ООПOwner является подклассом Player (или Owner и Player являются подклассами некоторого неопределенного класса, такого как участник или что-то в этом роде), но при учете постоянства кажется плохим дизайном базы данных иметь отдельные таблицы игроков и владельцев.
Моей первой мыслью было реорганизовать и использовать STI и сделать Owner подклассом Player или ввести новый базовый класс, а затем создать подкласс как Owner и Player.
Другая моя мысль заключалась в том, что я мог бы просто добавить логическое значение/ tinyint столбец Player называется is_owner, но я могу предвидеть, что потенциальноприводя к некоторому неприятному представлению и коду контроллера.
Мне было интересно, сталкивался ли кто-либо с подобными обстоятельствами и, возможно, имеет какой-либо совет или мог бы указать мне некоторые хорошие онлайн-ресурсы для чтения по STI?