开发者

Polymorphism in Mongoid

Is it possible to get real polymorphism in Mongoid?

Example:

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

The problem with this is it goes through the worker superclass to try to figure out the referenced documents type. W开发者_如何转开发hich means that while HOURS can be manipulated, the fields that belong to the subclasses cannot like CONTRIBUTORS, ORDER, TASK cannot. Is there a way to make this truely polymorphic?

And to elaborate when I say truely polymorphic, I mean is it possible to have the objects as workers and determine which type they are at a later time so their specific fields can be set. So I have the ability to loop over all workers but also the ability to set the worker's specific fields such as order and task when the Contributor or Manager is constructed.

Also if polymorphism is doable, what would a controller and view look like that fills out a Manager and Contributor's fields in the company?

Thanks


I had a similar problem before.. You'll need to google for "Mongoid Inheritance" and "Mongoid Self referential relationship" -- see also:

Mongoid 3 (current)

  • http://mongoid.org/en/mongoid/docs/documents.html#inheritance
  • http://mongoid.org/en/mongoid/docs/relations.html#has_many

Mongoid 2

  • http://two.mongoid.org/docs/documents/inheritance.html
  • http://two.mongoid.org/docs/relations/referenced/1-n.html

Mongoid also has the concept of "Inheritance" .. with which you can model extending the behavior of classes , like Manager < Worker , and Contributer < Worker in your example -- all three Classes are stored in the "Worker" collection.

You might also want to look at the "ancestry" Gem.

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜