По вашему требованию вы можете попробовать это
1) Простой подсчет количества свойств, которые имеют 1 или более
фото
Чтобы получить количество объектов, на которых есть одна или несколько фотографий, вы можете сделать это
Property.joins(:photos).distinct.count
Поскольку мы не используем group
, distinct
или uniq
необходимы. distinct
вернет ActiveRecord_Relation
и uniq
вернет Array
.
2) Я хотел бы, чтобы этот набор свойств был возвращен, чтобы я мог
создать область только этих свойств. Кроме того, у меня есть много
свойства с более чем 1 фото.
Чтобы получить все объекты недвижимости, которые имеют одну или несколько фотографий, вы можете использовать один и тот же запрос:
Property.joins(:photos).distinct
или вы можете использовать предложение group_by
:
Property.joins(:photos).group('properties.id')
Разница будет в том, что когда вы будете использовать метод size
в запросе group
, он вернет хеш с property_id в качестве ключа и количество фотографий в свойстве в качестве значения.
Обновление производительности:
Если вам всегда требуется количество связанных объектов и вы хотите эффективно их извлекать, вы можете использовать counter_cache
следующим образом:
class Photo < ApplicationRecord
belongs_to :property, counter_cache: true
end
class Property < ApplicationRecord
has_many :photos
end
И затем вам нужно будет добавить столбец в таблицу свойств с именем photos_count
, и Rails автоматически обновит столбец при каждом добавлении новой записи фотографии или удалении существующей записи фотографии. И тогда вы также можете запросить напрямую:
Property.where('photos_count > ?', 1)
Это необязательно, и вы можете сделать это, если у вас возникают проблемы с производительностью при получении данных.