0

У меня есть Profile и что has_many :ratings.Как запросить количество объектов в связанной модели?

Я хочу найти номер Profile объектов, которые имеют более 1 рейтинговой записи, связанной с ней.

Я попытался следующие без толку:

> Profile.includes(:ratings).where('ratings.count > 0').count 
    (38.2ms) SELECT COUNT(*) FROM "profiles" WHERE (ratings.count > 0) 
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "ratings" 
LINE 1: SELECT COUNT(*) FROM "profiles" WHERE (ratings.count > 0) 
              ^
: SELECT COUNT(*) FROM "profiles" WHERE (ratings.count > 0) 

И

> Profile.where('ratings.count > 1').count 
    (28.1ms) SELECT COUNT(*) FROM "profiles" WHERE (ratings.count > 1) 
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "ratings" 
LINE 1: SELECT COUNT(*) FROM "profiles" WHERE (ratings.count > 1) 
              ^
: SELECT COUNT(*) FROM "profiles" WHERE (ratings.count > 1) 

Примечание Это моя ratings модель не включает в себя столбец count. То, что я пытаюсь сделать, это count число ratings объектов, связанных с каждой записью profile, и вернуть число Profile записей, которые имеют более чем 1 рейтинг связанный объект.

Как достичь этого с помощью ActiveRecord?

Edit 1

Trying два больше запросов на предложения user793789 по:

> Profile.includes(:ratings).where('ratings.count > 1').references(:ratings).count 
    (55.3ms) SELECT COUNT(DISTINCT "profiles"."id") FROM "profiles" LEFT OUTER JOIN "ratings" ON "ratings"."profile_id" = "profiles"."id" WHERE (ratings.count > 1) 
ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: aggregate functions are not allowed in WHERE 
LINE 1: ...N "ratings"."profile_id" = "profiles"."id" WHERE (ratings.co... 
                  ^
: SELECT COUNT(DISTINCT "profiles"."id") FROM "profiles" LEFT OUTER JOIN "ratings" ON "ratings"."profile_id" = "profiles"."id" WHERE (ratings.count > 1) 

> Profile.joins(:ratings).where('ratings.count > 1').count 
    (40.4ms) SELECT COUNT(*) FROM "profiles" INNER JOIN "ratings" ON "ratings"."profile_id" = "profiles"."id" WHERE (ratings.count > 1) 
ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: aggregate functions are not allowed in WHERE 
LINE 1: ...N "ratings"."profile_id" = "profiles"."id" WHERE (ratings.co... 
                  ^
: SELECT COUNT(*) FROM "profiles" INNER JOIN "ratings" ON "ratings"."profile_id" = "profiles"."id" WHERE (ratings.count > 1) 

ответ

0
Profile.includes(:ratings).where('ratings.count > 0').references(:ratings).count 

OP Править 1

После долгих поддержки и forthing, мы, наконец, остановились на этом :

Profile.joins(:ratings).group('profiles.id').having('count(ratings.id) > 0').length 

Но я чувствую, что должен быть более простой способ сделать это.

+0

или Профиль.joins (: оценки) .where ('ratings.count> 0'). Count – user793789

+0

Нет ... ни один из них не работает для меня. Они работали на вас? – marcamillion

+0

Профиль has_one рейтинг или has_many рейтинги? – user793789

Смежные вопросы