web-dev-qa-db-ja.com

Railsクエリで関連モデルの属性を取得します

私の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") //ここの構文は正しくありません

15
scientiffic

これを試して:

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

残念ながら、1回のクエリでARを介してそれを行うことはできないと思います。以下のネストされたクエリを実行して、データベースへの2つのクエリで取得できます。

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