0

私はProfileとそのhas_many :ratingsを持っています。関連するモデル上のオブジェクトの数をクエリするにはどうすればよいですか?

見つけたいのは、それに関連付けられた評価レコードが2つ以上ある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という列が含まれていないこと。私がやろうとしているのはcountratingsのオブジェクトの番号で、それぞれprofileレコードに関連付けられており、のレコードの数は1の関連オブジェクトを超えています。

ActiveRecordでどのように達成できますか?

編集1

user793789の提案ごとに2つの以上のクエリしようとすると:多くのバッキングとforthing後

> 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

を、我々は最終的に、この上で決着:

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

しかし、私はこれを行うより簡単な方法が必要なように感じています。

+0

または Profile.joins(:ratings).where( 'ratings.count> 0')。カウント – user793789

+0

いいえ...どちらも私のために働いていません。彼らはあなたのために働いたのですか? – marcamillion

+0

プロフィールhas_oneの評価またはhas_manyの評価? – user793789

関連する問題