2013-03-10 7 views
1

J'essaye de rechercher un document incorporé par son identifiant, et le renvoie. C'est possible, mais seulement, pour autant que je le vois, en utilisant mongo pour trouver le document qui l'incorpore, puis en cherchant ce document en ruby ​​pour le document embarqué que je cherche. Comme ceci:Mongoid find document incorporé

# commenter.rb 
    def post 
    # todo: find syntax do avoid double query 
    if user = User.any_of({'posts.commenter_ids' => self.id}).last 
     user.posts.where('commenter_ids' => self.id).last 
    end 
    end 

Cela semble simple, mais je n'ai pas trouvé tout ce que je l'aime de toute évidence sur la recherche google/SO.

Pensées?

+2

Voulez-vous s'il vous plaît fournir vos modèles? –

Répondre

-1

Vous ne pouvez pas trouver une ressource sans le document qu'elle contient. Si vous voulez juste une relation entre les deux au lieu de l'intégrer, vous devez utiliser has_many au lieu de embeds_many http://mongoid.org/en/mongoid/docs/relations.html#has_many. Vous pouvez ensuite trouver le document sans son document associé.

1

À l'heure actuelle, j'inclus les fonctionnalités suivantes dans mes documents intégrés. Cela nécessite que vous définissiez l'option inverse_of sur la relation imbriquée.

# Returns the parent "embedded_in" relationship for this document 
# @return [Mongoid::Relations::Metadata] 
def self.parent_relationship 
    @parent_relationship ||= relations.values.find do |relation| 
    relation.macro == :embedded_in 
    end 
end 

# finds the document off of a root document. This method currently only works correctly if 
# you explicitly set the inverse_of value on the embedded_in relationship 
# @param [string | Moped::BSON::ObjectId] id 
def self.find_using_parent(id) 
    id = id.is_a?(Moped::BSON::ObjectId) ? id : Moped::BSON::ObjectId(id) 
    parent = parent_relationship.class_name.to_const.where("#{parent_relationship.inverse_of}._id" => id).first 
    if parent 
    parent.__send__(parent_relationship.inverse_of).find(id) 
    end 
end 
2

I Override méthode de recherche sur mes documents intégrés en utilisant ce point essentiel: https://gist.github.com/cblavier/7889042

Il est particulièrement pratique quand je veux utiliser DelayedJob pour retarder les méthodes de documents intégrés (parce que travailleur DJ utilisera find (id) désérialiser le travail)

+0

Man, vous êtes le MVP! Sera toujours difficile en cas d'intégration polymorphique (dans ce cas, il n'y a pas d'autre choix que d'exporter la chaîne/le type d'ID brut et d'utiliser la méthode find_through appropriée) –

Questions connexes