Pluck associated model's attribute in Rails query

匿名 (未验证) 提交于 2019-12-03 03:05:02

问题:

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

回答1:

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') 


回答2:

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) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!