У меня есть родительский класс Job
, который может иметь от 0 до многих LaserSheets
:Rails: список всех родительских объектов, чьи дети имеют ненулевое значение
class Job < ActiveRecord::Base
has_many :laser_sheets
...
end
class LaserSheet < ActiveRecord::Base
belongs_to :job
...
end
В настоящее время index
действия в контроллере Job
возвращает все Jobs
с 1 или более LaserSheets
:
class JobsController < ApplicationController
...
def index
@jobs = Job.joins(:laser_sheets).uniq.all.order(sort_column + " " + sort_direction)
end
...
end
LaserSheet
имеет атрибут DATETIME cut_at
. Я хотел бы иметь возможность фильтровать результаты Job
, чтобы показать только Jobs
, где все LaserSheets
имеют ненулевые cut_at
атрибуты.
Я нашел an answer, объясняя, как фильтровать детей на основе атрибута родителя, но я не смог понять, как это сделать в обратном порядке.
Редактировать 2/17/16:
рекомендацияPer Хьеу, я попытался следующие:
@jobs = Job.joins(:laser_sheets).where('laser_sheets.id NOT IN (SELECT id
FROM laser_sheets
WHERE cut_at IS NULL)')
Он не явился на работу, поэтому я высевают пустую базу данных со следующими тест информация:
Job.create!(id: 1, name: "Job 1")
Job.create!(id: 2, name: "Job 2")
Job.create!(id: 3, name: "Job 3")
LaserSheet.create!(id: 1, name: "1", job_id: 1, cut_at: nil)
LaserSheet.create!(id: 2, name: "2", job_id: 1, cut_at: nil)
LaserSheet.create!(id: 3, name: "3", job_id: 2, cut_at: nil)
LaserSheet.create!(id: 4, name: "4", job_id: 2, cut_at: "2016-02-17 23:00:00")
LaserSheet.create!(id: 5, name: "5", job_id: 3, cut_at: "2016-02-17 23:00:00")
LaserSheet.create!(id: 6, name: "6", job_id: 3, cut_at: "2016-02-17 23:00:00")
правильный ответ на мой вопрос должен возвращать только Job 3
, так как это единственный Job
со всеми LaserSheets
с не-NULL cut_at
. Я побежал предложенный ответ Хьеу в:
jobs = Job.joins(:laser_sheets).where('laser_sheets.id NOT IN (SELECT id FROM laser_sheets WHERE cut_at IS NULL)')
Job Load (0.5ms) SELECT "jobs".* FROM "jobs" INNER JOIN "laser_sheets" ON "laser_sheets"."job_id" = "jobs"."id" WHERE (laser_sheets.id NOT IN (SELECT id FROM laser_sheets WHERE cut_at IS NULL))
и возвращает как Job 2
и Job 3
, которые не то, что я ищу.
Редактировать 2/19/16: добавил cut_at информацию, чтобы проверить случай
Это работает, спасибо! – Ryan