在我的rails应用中,馆藏有很多项目,项目有很多步骤。
我想抓住集合项目中的所有步骤ID,我想知道我是否可以在一个查询中完成所有操作。
例如,我知道我可以执行以下操作
step_ids = []
@collection.projects.each do |project|
project.steps.each do |step|
step_ids << step.id
end
end
但是可以做以下事情:
@collection.projects.include(:steps).pluck("step.id")
//这里的语法不正确
答案 0 :(得分:24)
试试这个:
Step.joins(:project).where(projects: { collection_id: @collection.id }).pluck(:'steps.id')
请注意project
用于连接,然后projects
用于where子句。第一个对应于belongs_to关系,后者是db表的名称。
编辑:如果项目和集合之间存在多对多关系,并假设项目属于project_collection(然后是has_many :collections, through :project_collection
)
Step.joins(:project => :project_collection)
.where(project_collections: { collection_id: @collection.id })
.pluck(:'steps.id')
答案 1 :(得分:1)
不幸的是,我不认为我们可以通过AR在单个查询中完成。您可以在下面执行嵌套查询,以便在对数据库的两个查询中检索它:
Step.includes(:projects)
.where(projects: { id: Projects.includes(:collections)
.where(collections: { id: @collections.id }).pluck(:id) } )
.pluck(:id)