Rails: Полиморфная ассоциация необходима для подклассов в структуре STI? - PullRequest
2 голосов
/ 11 ноября 2011

Я работаю над хобби-проектом и имею абстрактную Event модель с подклассами STI Meal, Outing, Medication и т. Д. У родительской модели Event есть start_time, end_time description и т. Д.

Я хочу иметь вложенные ресурсы для различных подклассов. Например, я хочу иметь возможность присоединять несколько экземпляров класса Image к любому подклассу Event. Я хочу иметь возможность прикрепить несколько экземпляров класса Medicine к сущностям Medication, несколько экземпляров от Location до Outing и т. Д.

Моя причина для рассмотрения полиморфизма состоит в том, чтобы обеспечить гибкость, чтобы, возможно, любой из различных типов вложенных ресурсов мог быть присоединен к любому из подклассов Event. Это позволило бы кому-то присоединить лекарство "Дополнения Витамина D". "к Meal, например.

Мои вопросы:

  1. Должны ли вложенные ресурсы быть полиморфными?
  2. Если я сделаю их полиморфными, будут ли все экземпляры содержать Event в таблице типов?
  3. Если это так, я должен просто сделать их has_many отношения?
  4. Есть ли какое-то преимущество в производительности, чтобы сделать их has_many по сравнению с полиморфными?

1 Ответ

0 голосов
/ 24 ноября 2014

(1) Да.

(2) Да, в зависимости от того, как вы справляетесь с полиморфизмом. Rails допускает STI (наследование одной таблицы), поэтому все подтипы событий могут наследовать отношение has_many. Связанная запись has_many может иметь много подтипов, и все они будут отображаться как отношения при вызове.

(3) has_many может использоваться вместе с полиморфным, они не являются взаимоисключающими.

(4) Опять же, эти два понятия не являются взаимоисключающими. На самом деле полиморфность необходима для вашего отношения принадлежащих вам. Ваша связанная запись должна включать в свою таблицу относительные_отношения и относительные_типы. Например, если вы используете STI, вы должны сделать это так:

class BaseClass < ActiveRecord::Base
  has_many :foo
end

class SubClass < BaseClass
  # inherits has_many :foo relation from BaseClass
end

class Foo < ActiveRecord::Base
  belongs_to :base_class, polymorphic: true
end

class Bar < Foo
  # inherits belongs_to :base_class from Foo
end

При вызове sub_class-instance.foos вы должны получить отношение ActiveRecord всех foos, включая подтипы.

...