Найти все записи с количеством ассоциаций ноль и ноль-ноль - PullRequest
1 голос
/ 23 апреля 2020
class Gallery < ApplicationRecord
  has_many :associated_images, as: :imageable
end

class Event < ApplicationRecord
  has_many :associated_images, as: :imageable
end

class Image < ApplicationRecord
  has_many :associated_images
end

class AssociatedImage < ApplicationRecord
  belongs_to :imageable, polymorphic: true
  belongs_to :image
end

Я хотел бы получить все изображения, которые используются, и другой запрос, чтобы получить все изображения, которые не используются (на основе AssociatedImage).

Я пытался Image.joins(:associated_images).group('images.id').having('count(image_id) > 0') и возвращает правильный результат. Но когда я запускаю Image.joins(:associated_images).group('images.id').having('count(image_id) = 0'), он возвращает пустое #<ActiveRecord::Relation []>, и я не уверен, почему это так.

Мой запрос основан на Найти все записи, у которых количество ассоциаций больше чем ноль обсуждение

1 Ответ

0 голосов
/ 23 апреля 2020

Причина в том, что в SQL отсчет нуля происходит, когда нет строк. Таким образом, если нет строк, даже групп, результат не будет.

То, что вы хотите:

Image.left_joins(:associated_images).where(associated_images: {id: nil}).group('images.id')

Когда SQL выполняет левое соединение, для изображения, которое не имеет связанное изображение, оно заполняет NULL для всех столбцов в таблице associated_images. Так что те, где associated_images.id равен нулю, это те, которые мы хотим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...