Давайте предположим, что ваши модели выглядеть примерно так:
class Category < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :category
end
Давайте также предположим:
- каждая фотография имеет
qty_download
поле, как вы описали в своем вопрос
- в каждой категории имеется
name
Поле
- цель состоит в том, чтобы заказать отображение категорий в соответствии с сумма всех
qty_download
для всех фотографий в каждой категории
- это нормально полностью исключить категории, которые не имеют никаких связанных фотографий
с этими предположениями, вы должны быть в состоянии написать
Category.
joins(:photos).
group("categories.id, categories.name").
select("categories.id, categories.name, sum(photos.qty_download) as total_downloads").
order("total_downloads desc")
Обратите внимание, что будет возвращен будет «пар которые содержат только id
, name
и total_downloads
. Если вам нужны дополнительные поля категорий, добавьте их как в пункты group
, так и в пункты select
.
Update
Новые версии Postgres позволяют упростить запрос:
Category.
joins(:photos).
group("categories.id").
select("categories.*, sum(photos.qty_download) as total_downloads").
order("total_downloads desc")
Обратите внимание, что в последних версиях Postgres, вы можете просто группа уникальным идентификатором - вы больше не должны группироваться по всем атрибутам, которые вы хотите включить в свой выбор. Таким образом, теперь вы можете включить все атрибуты категорий как categories.*
. Я оставлю оригинал на месте, поскольку он (незначительно) более эффективен и обратно совместим со старыми версиями Postgres.
И в случае, если вы хотите, чтобы все поля из категории, сделайте следующее: выберите ("категории *, SUM (фото..qty_download) AS times_downloaded ") И я думаю, что просто группировка с помощью" categories.id "должна быть достаточной – Humza
По крайней мере, для Postgres, когда вы используете группу, все в предложении' select' должно либо появляться в предложении 'group by' или быть агрегированной функцией, поэтому ни одно из ваших предложений не будет работать. YMMV с другими базами данных. –
вы положительны? потому что я запускал оригинал на mysql, но теперь я нахожусь в проекте rails, используя postgres, и следующее прекрасно выполняется из rails console: 'Model1.limit (1) .joins (: model2s) .group (" # {Model1.table_name} .id "). select (" # {Model1.table_name}. *, SUM (# { Model2.table_name} .id) AS mgids ")' – Humza