可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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)