2010-09-29 15 views
5

¿Alguien sabe cómo hacer una asociación polimórfica en Mongoid que es del favor relacional pero no del incrustante?Mongoid relational Polymorphic Association

Por ejemplo, este es mi modelo Assignment:

class Assignment 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :user 
    field :due_at, :type => Time 

    referenced_in :assignable, :inverse_of => :assignment 
end 

que puede tener una relación polimórfica, con diversos modelos:

class Project 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :name, :type => String 

    references_many :assignments 
end 

Esto arroja un error que dice desconocido constante asignable. Cuando cambio el reference a embed, todo esto funciona como está documentado en Mongoid's documentation, pero necesito que sea reference.

Gracias!

Respuesta

4

De Mongoid Google Group parece que esto no es compatible. Aquí está el newest relevant post que encontré.

De todos modos, esto no es difícil de implementar manualmente. Aquí está mi enlace polimórfico llamado Asunto.

Implementar la parte inversa de la relación puede ser algo más complicado, especialmente porque necesitará el mismo código en varias clases.

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

Así que creo que es posible ahora : http://groups.google.com/group/mongoid/browse_thread/thread/edd3df20142625c4/bc56350c4ba198bc?lnk=gst&q=polymorphic#bc56350c4ba198bc – Vojto

20

Respondiendo a una publicación antigua, pero a alguien le puede resultar útil.

Ahora también hay un polimórfica 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

rieles 4+

Así es como implementarías polimórficos Asociaciones en Mongoid para un modelo Comment que pueden pertenecer tanto a una Post y modelo Event.

El Comment Modelo:

class Comment 
    include Mongoid::Document 
    belongs_to :commentable, polymorphic: true 

    # ... 
end 

Post/Event Modelos:

class Post 
    include Mongoid::Document 
    has_many :comments, as: :commentable 

    # ... 
end 

utilizando la preocupación:

en Rails 4+, puede utilizar el patrón de preocupación y crear un nuevo módulo llamado commentable en app/models/concerns:

module Commentable 
    extend ActiveSupport::Concern 

    included do 
    has_many :comments, as: :commentable 
    end 
end 

y justo include este módulo en sus modelos:

class Post 
    include Mongoid::Document 
    include Commentable 

    # ... 
end