scientiffic
scientiffic

Reputation: 9415

Pluck associated model's attribute in Rails query

In my rails app, collections have many projects, and projects have many steps.

I'd like to grab all the ids of steps in a collection's projects, and I'm wondering if I can do it all in one query.

For example, I know I can do the following

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

But is it possible to do something like the following:

@collection.projects.include(:steps).pluck("step.id") // syntax here is not correct

Upvotes: 30

Views: 28781

Answers (2)

nikkon226
nikkon226

Reputation: 1008

Unfortunately, I don't think that we could do it through AR in a single query. You could do a nested query below to retrieve it in two queries to the database:

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

Upvotes: 1

John
John

Reputation: 2828

Try this:

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

Note the use of project for the joins, and then projects for the where clause. The first corresponds to the belongs_to relationship, and the latter is the name of the db table.

edit: in the case of a many-to-many relationship between projects and collections, and assuming a project belongs_to a project_collection (and then has_many :collections, through :project_collection)

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

Upvotes: 50

Related Questions