Полиморфизм в монгоиде - PullRequest
       19

Полиморфизм в монгоиде

3 голосов
/ 02 октября 2011

Можно ли получить настоящий полиморфизм в Mongoid?

Пример:

class Company
  include Mongoid::Document

  has_many :workers, as: :workable
end

class Worker
  include Mongoid::Document
  field :hours
  belongs_to :workable, polymorphic: true
end

class Manager < Worker
  field :order
  has_many  :contributors
end

class Contributor < Worker
  field :task
end

Проблема с этим заключается в том, что он проходит через рабочий суперкласс, чтобы попытаться выяснить тип ссылочных документов. Это означает, что, хотя HOURS можно манипулировать, поля, принадлежащие подклассам, не могут быть похожи на CONTRIBUTORS, ORDER, TASK - нет. Есть ли способ сделать это по-настоящему полиморфным?

И чтобы уточнить, когда я говорю «по-настоящему полиморфный», я имею в виду, возможно ли иметь объекты в качестве рабочих и определить, к какому типу они относятся в более позднее время, чтобы можно было установить их конкретные поля. Таким образом, у меня есть возможность зацикливаться на всех работниках, а также возможность задавать конкретные поля работника, такие как порядок и задача, когда создается Contributor или Manager.

Также, если полиморфизм выполним, как бы выглядел контроллер и представление, заполняющее поля диспетчера и участника в компании?

Спасибо

1 Ответ

4 голосов
/ 03 октября 2011

У меня была похожая проблема раньше .. Вам нужно будет зайти в Google для "Mongoid Inheritance" и "Mongoid Self referencerential ratio" - см. Также:

Mongoid 3 (текущий)

Mongoid 2

Mongoid также имеет концепцию "Наследования" .. с помощью которой вы можете моделировать расширение поведения классов, таких как Manager

Возможно, вы также захотите взглянуть на камень «предков».

try:

class Company
  include Mongoid::Document

  has_many :workers
end

class Worker
  include Mongoid::Document
  field :hours
  belongs_to :company
end

class Manager < Worker
  field :order
  references_many  :contributors, :class_name => "Worker"
end

class Contributor < Worker
  field :task
  belongs_to_related :manager, :class_name => "Worker"
end
...