Полиморфизм в Mongoid

#ruby-on-rails #mongodb #polymorphism #mongoid #database-schema

#ruby-on-rails #mongodb #полиморфизм #mongoid #база данных-схема

Вопрос:

Возможно ли получить реальный полиморфизм в 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
  

Проблема в том, что он проходит через суперкласс worker, чтобы попытаться определить тип документов, на которые ссылаются. Это означает, что, хотя ЧАСАМИ можно манипулировать, поля, принадлежащие подклассам, не могут нравиться УЧАСТНИКАМ, ЗАКАЗ, ЗАДАЧА не могут. Есть ли способ сделать это действительно полиморфным?

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

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

Спасибо

Комментарии:

1. как насчет коллекции задач?

2. коллекции задач и участников в примере не имеют значения. Я вставил их, чтобы завершить пример. Просто представьте, что у них есть поля, отличные от worker

Ответ №1:

У меня была похожая проблема раньше.. Вам нужно будет поискать в Google «Mongoid Inheritance» и «Mongoid Self referential relationship» — смотрите также:

Mongoid 3 (текущий)

Mongoid 2

В Mongoid также есть концепция «наследования» .. с помощью которой вы можете моделировать расширение поведения классов, таких как Manager < Worker и Contributer < Worker в вашем примере — все три класса хранятся в коллекции «Worker».

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

попробуйте:

 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
  

Комментарии:

1. Спасибо, что работает … мой следующий вопрос: как нам заполнить это, используя вложенные атрибуты в форме. Это еще один пост, хотя

2. можете ли вы опубликовать это как отдельный вопрос?