[英]How do I query the number of objects on an associated model?
我有Profile
和has_many :ratings
。
我想要找到的是具有超過1個與之關聯的評級記錄的Profile
對象的數量。
我嘗試了以下無濟於事:
> 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實現這一目標?
編輯1
每個用戶嘗試兩次查詢793789的建議:
> 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)
Profile.includes(:ratings).where('ratings.count > 0').references(:ratings).count
OP的編輯1
經過多次支持和支持,我們終於解決了這個問題:
Profile.joins(:ratings).group('profiles.id').having('count(ratings.id) > 0').length
但我覺得必須有一個更簡單的方法來做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.