簡體   English   中英

如何查詢關聯模型上的對象數?

[英]How do I query the number of objects on an associated model?

我有Profilehas_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM