2014-10-23 18 views
11

Nella mia applicazione Rails, collezioni hanno molti progetti e progetti hanno molti passi.Pluck del modello associato in Rails interrogare

Mi piacerebbe prendere tutti gli ID di passaggi nei progetti di una raccolta e mi chiedo se posso fare tutto in un'unica query.

Per esempio, io so che posso fare la seguente

step_ids = [] 
@collection.projects.each do |project| 
    project.steps.each do |step| 
     step_ids << step.id 
    end 
end 

ma è possibile fare qualcosa di simile al seguente:

@collection.projects.include(:steps).pluck("step.id") // sintassi qui non è corretto

risposta

20

Prova questo :

Step.joins(:project).where(projects: { collection_id: @collection.id }).pluck(:'steps.id') 

Nota l'uso di project per i join e quindi projects per la clausola where. Il primo corrisponde alla relazione belongs_to e il secondo è il nome della tabella db.

edit: nel caso di una relazione molti-a-molti tra i progetti e le collezioni, e ipotizzando un progetto belongs_to un project_collection (e quindi has_many :collections, through :project_collection)

Step.joins(:project => :project_collection) 
    .where(project_collections: { collection_id: @collection.id }) 
    .pluck(:'steps.id') 
+0

grazie per il vostro aiuto. i progetti possono effettivamente appartenere a più raccolte, quindi non esiste un attributo collection_id per i progetti. qualche idea su come cambiare il tuo suggerimento? – scientiffic

+0

c'è una tabella 'projects_collections' allora? Puoi estendere il join per includerlo .... Modificherò la mia risposta con un esempio. – John

+0

grazie per il tuo esempio: ha funzionato per me! – scientiffic

1

Purtroppo, non credo che abbiamo potrebbe farlo attraverso AR in una singola query. È possibile eseguire una query nidificata di seguito per recuperarla in due query nel database:

Step.includes(:projects).where(projects: { id: Projects.includes(:collections).where(collections: { id: @collections.id }).pluck(:id) }).pluck(:id) 
Problemi correlati