Причина в том, что в SQL отсчет нуля происходит, когда нет строк. Таким образом, если нет строк, даже групп, результат не будет.
То, что вы хотите:
Image.left_joins(:associated_images).where(associated_images: {id: nil}).group('images.id')
Когда SQL выполняет левое соединение, для изображения, которое не имеет связанное изображение, оно заполняет NULL для всех столбцов в таблице associated_images
. Так что те, где associated_images.id
равен нулю, это те, которые мы хотим.