5

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

これにより、不明な定数が割り当て可能であるというエラーがスローされます。を に変更するreferenceembed、これはすべてMongoid のドキュメントに記載されているとおりに機能しますが、 にする必要がありますreference

ありがとう!

4

3 に答える 3

21

古い投稿への回答ですが、誰かが役に立つと思うかもしれません。

ポリモーフィックもあります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
于 2012-03-05T07:38:10.797 に答える
4

Mongoid Google Groupからは、これはサポートされていないようです。これが私が見つけた最新の関連する投稿です。

とにかく、これは手動で実装するのは難しいことではありません。これが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
于 2010-12-27T12:56:02.217 に答える