有没有人知道如何在Mongoid
中进行多态关联,这种关联有利于关系,而不是嵌入关联。
例如,这是我的Assignment
模型:
class Assignment
include Mongoid::Document
include Mongoid::Timestamps
field :user
field :due_at, :type => Time
referenced_in :assignable, :inverse_of => :assignment
end
可以与多个模型建立多态关系:
class Project
include Mongoid::Document
include Mongoid::Timestamps
field :name, :type => String
references_many :assignments
end
这会抛出一个错误,指出未知的常量Assignable。当我将reference
更改为embed
时,这一切都按照Mongoid's documentation中的说明进行操作,但我需要reference
。
谢谢!
答案 0 :(得分:20)
回答古老的帖子,但有人可能觉得它很有用。
现在还有一个多态belongs_to
:
class Action
include Mongoid::Document
include Mongoid::Timestamps::Created
field :action, type: Symbol
belongs_to :subject, :polymorphic => true
end
class User
include Mongoid::Document
include Mongoid::Timestamps
field :username, type: String
has_many :actions, :as => :subject
end
class Company
include Mongoid::Document
include Mongoid::Timestamps
field :name, type: String
has_many :actions, :as => :subject
end
答案 1 :(得分:4)
来自Mongoid Google Group似乎不支持此功能。这是我找到的newest relevant post。
无论如何,这并不难以手动实现。这是我的多态链接,名为Subject。
实现关系的反向部分可能会稍微复杂一些,尤其是因为跨多个类需要相同的代码。
class Notification
include Mongoid::Document
include Mongoid::Timestamps
field :type, :type => String
field :subject_type, :type => String
field :subject_id, :type => BSON::ObjectId
referenced_in :sender, :class_name => "User", :inverse_of => :sent_notifications
referenced_in :recipient, :class_name => "User", :inverse_of => :received_notifications
def subject
@subject ||= if subject_type && subject_id
subject_type.constantize.find(subject_id)
end
end
def subject=(subject)
self.subject_type = subject.class.name
self.subject_id = subject.id
end
end
答案 2 :(得分:1)
以下是如何在 Mongoid 中为Comment
模型实现多态关联,该模型可以同时属于Post
和Event
模型。
Comment
模型:
class Comment
include Mongoid::Document
belongs_to :commentable, polymorphic: true
# ...
end
Post
/ Event
模特:
class Post
include Mongoid::Document
has_many :comments, as: :commentable
# ...
end
使用疑虑:
在Rails 4+中,您可以使用Concern模式并在commentable
中创建一个名为app/models/concerns
的新模块:
module Commentable
extend ActiveSupport::Concern
included do
has_many :comments, as: :commentable
end
end
并且模型中只有include
这个模块:
class Post
include Mongoid::Document
include Commentable
# ...
end