Связанный с моделью атрибут модели в Rails-запросе

В моем приложении rails коллекции имеют много проектов, а проекты имеют много шагов.

Я хотел бы захватить все идентификаторы шагов в проектах коллекции, и мне интересно, могу ли я сделать все это в одном запросе.

Например, я знаю, что могу сделать следующее

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")//синтаксис здесь неверен

Ответ 1

Попробуйте следующее:

Step.joins(:project).where(projects: { collection_id: @collection.id }).pluck(:'steps.id')

Обратите внимание на использование project для объединений, а затем projects для предложения where. Первый соответствует отношению belongs_to, а последнее - имя таблицы db.

edit: в случае отношения "много-ко-многим" между проектами и коллекциями и предполагая, что проект принадлежит _ project_collection (а затем has_many :collections, through :project_collection)

Step.joins(:project => :project_collection)
    .where(project_collections: { collection_id: @collection.id })
    .pluck(:'steps.id')

Ответ 2

К сожалению, я не думаю, что мы могли бы сделать это через AR в одном запросе. Вы можете выполнить вложенный запрос ниже, чтобы получить его в двух запросах к базе данных:

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