私のRailsアプリでは、コレクション多くのプロジェクトがあり、プロジェクトには多くのステップがあります。
コレクションのプロジェクトのステップのすべてのIDを取得したいのですが、1つのクエリですべてを実行できるかどうか疑問に思っています。
たとえば、私は次のことができることを知っています
_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")
//ここの構文は正しくありません
これを試して:
Step.joins(:project).where(projects: { collection_id: @collection.id }).pluck(:'steps.id')
結合にproject
を使用し、次にwhere句にprojects
を使用していることに注意してください。前者は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回のクエリでARを介してそれを行うことはできないと思います。以下のネストされたクエリを実行して、データベースへの2つのクエリで取得できます。
Step.includes(:projects)
.where(projects: { id: Projects.includes(:collections)
.where(collections: { id: @collections.id }).pluck(:id) } )
.pluck(:id)