2013-07-22 3 views
1

je les 2 modèles suivants dans un Rails 3.2.13 application:MongoId: trouver tous les enfants documents de plusieurs documents parents

class Organization 
    include Mongoid::Document 
    include Mongoid::Search 

    field :name 
    field :description 

    has_many :locations 

    search_in :name, :description, :locations => [:name, :description, :keywords] 
end 

class Location 
    include Mongoid::Document 

    field :name 
    field :description 
    field :keywords, type: Array 

    belongs_to :organization 

    def self.find_by_keyword(keyword) 
    locs = [] 
    orgs = Organization.full_text_search(keyword) 
    orgs.each { |org| locs.push(org.locations) } 
    locs.flatten 
    end 
end 

En locations_controller.rb, j'ai cette méthode de recherche:

def search 
    @results = Kaminari.paginate_array(Location.find_by_keyword(params[:keyword])).page(params[:page]).per(30) 
end 

En utilisant le mongoid_search gem, je peux chercher le mot-clé (le terme de recherche) dans tous les champs pour les modèles Organisation et Location, et obtenir toutes les organisations qui correspondent:

orgs = Organization.full_text_search(keyword)

Mais ce que je veux, c'est de retourner tous les emplacements qui appartiennent aux organisations du résultat de la recherche. La seule façon que j'ai pu faire était de parcourir chaque organisation, puis pousser ses emplacements à un tableau, puis retourner le tableau aplati. Pour que le code du contrôleur fonctionne, j'ai dû utiliser la méthode paginate_array de Kaminari.

Ma question est, y at-il un meilleur moyen d'atteindre le même résultat sans utiliser la méthode paginate_array?

Merci!

Répondre

1

Vous pouvez utiliser organization_id.in

@locations = Location.where(:organization_id.in => orgs.map(&:id)) 
+0

Merci! C'est beaucoup plus concis. – monfresh

Questions connexes