Связанный с моделью атрибут модели в 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)