2016-07-11 5 views
0

In einer Rails-Anwendung Ich habe zwei Modelle abzurufen, die über has_many und belongs_to Assoziationen verbunden sind:Wie alle zugehörigen Objekte aus einer vorhandenen Auswahlsatz in Rails

class Entity < ActiveRecord::Base 
    has_many :applicants 
end 
class Applicant < ActiveRecord::Base 
    belongs_to :entity 
end 

ich SearchKick bin mit ein paar Einheiten wählen Sie zuerst - Die Details dazu sind nicht wirklich wichtig, aber gegeben eine Sammlung von Entity-Objekten, wie kann ich alle verwandten Applicant Objekte abrufen?

# select some entities (in my app I'm using SearchKick to run the search) 
entities = Entity.search params[:query] 

# now find the applicants related to the selected entities 
applicants = entities.??? 

Dies funktioniert, aber sehr langsam eine große Auswahl gegeben:

# retrieve the applicants related to the selected entities 
applicants = [] 
entities.each do |entity| 
    applicants += entity.applicants 
end 

Gibt es die Bewerber Kurz Hand eine Rails zum Abrufen der ausgewählten Elemente im Zusammenhang? Ich

Andere Dinge haben versucht:

entities.class => Entity::ActiveRecord_Relation 
entities.applicants => #error 
entities.applicant_ids => #error 

Antwort

0

Diese Antwort kam von Andrew Kane zu bekommen, den Entwickler von SearchKick:

Eine Möglichkeit ist es, die include Option zu verwenden, um Eager laden Verbände.

Entity.search "*", include: [:applicants] 

Eine weitere Option ist es, alle IDs von den Unternehmen zu bekommen, und sie in eine Abfrage für die Antragsteller übergeben.

Applicant.where(entity_id: entities.map(&:id)) 

fand ich, dass die zweite Option für mich gut funktioniert.

0

Wie das?

Applicant.joins(:entity).where("entities.id < ?", 1000) 
+0

Danke, ich wusste nicht über '.joins'. Ihr Code funktioniert - aber ich habe mein Codebeispiel vereinfacht, um es reproduzierbar zu machen. In meiner App verwende ich SearchKick so 'entities = Entity.search params [: query]', wo die Abfrage kompliziert sein kann. Ist es möglich, Ihre Antwort so zu modifizieren, dass Sie einen vorhandenen Satz von Merkmalen in 'entities' verwenden (anstatt die' where'-Klausel einzuschließen)? –

+0

Ich bin nicht vertraut mit searchKick, ich habe nur mit elasticsearch herumgespielt, es sieht so aus, als müsste man die Assoziation eifrig laden und die 'search_data' wie [this] definieren (http://stackoverflow.com/a/21383143/1301840), es ist ein bisschen verwirrend für mich, dass Sie "Bewerber" mit den "Entitäten" finden möchten, dann sollte die Suche auf "Antragsteller" Seite mit der Assoziation sein – lusketeer

+0

yeah Sie könnten mit der Suche auf Bewerber stattdessen Recht haben. Die Entitäten haben jedoch die Attribute, nach denen ich suchen muss (in diesem Fall lat/long). Vielleicht muss ich die Modelle und Beziehungen umgestalten, um dies zu unterstützen. Danke für die bisherigen Tipps. –

0
Entity.where("id < ? ", 1000).includes(:applicants) 

Um alle Bewerber

Entity.where("id < ? ", 1000).includes(:applicants).collect(&:applicants).flatten 
Verwandte Themen