是否有可能在 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 父类(super class)来尝试找出引用的文档类型。这意味着虽然可以操纵 HOURS,但属于子类的字段不能像 CONTRIBUTORS、ORDER、TASK 那样。有没有办法让这个真正多态?
详细说明当我说真正的多态时,我的意思是是否可以将对象作为 worker 并在以后确定它们是哪种类型,以便可以设置它们的特定字段。所以我有能力遍历所有工作人员,也有能力在构造 Contributor 或 Manager 时设置工作人员的特定字段,例如订单和任务。
此外,如果多态是可行的,填充公司中经理和贡献者字段的 Controller 和 View 会是什么样子?
谢谢
最佳答案
我以前遇到过类似的问题。您需要在谷歌上搜索“Mongoid Inheritance”和“Mongoid Self referential relationship”——另请参阅:
Mongoid 3(当前)
- http://mongoid.org/en/mongoid/docs/documents.html#inheritance
- http://mongoid.org/en/mongoid/docs/relations.html#has_many
半人半兽 2
- http://two.mongoid.org/docs/documents/inheritance.html
- http://two.mongoid.org/docs/relations/referenced/1-n.html
Mongoid 也有“继承”的概念。您可以用它来模拟扩展类的行为,例如您的示例中的 Manager < Worker 和 Contributer < Worker —— 所有三个类都存储在“Worker”集合中.
您可能还想看看“祖先” gem 。
尝试:
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
关于ruby-on-rails - Mongoid 中的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7628135/