2012-02-14 4 views
1

私は、そのユーザーに属しているユーザーおよびタスクを所有しています。私は5つ未満のタスクを持つユーザーの数を取得したいと思います。それをどうやってやりますか?関連付けの数に基づいてレコードのリストをフィルタリングするにはどうすればよいですか?

User.joins(:tasks).select("users.*, count(*) as task_count").having("task_count < 5").group(:id) 

EDIT:そこにこれを行うための簡単な方法ですが、これは動作するかどう

答えて

0

わからない以上は少なくとも1つの関連付けられたタスクを持っているユーザーのインスタンスを返します。

User.joins("LEFT JOIN tasks ON tasks.user_id = users.id").select("users.*, IFNULL(count(tasks.id), 0) AS task_count").having("task_count < 5").group(:id) 

しかし、よりよい解決策は自分のUserモデルにcounter_cacheを追加するために、おそらくです:あなたが欲しい

です。

+0

。それは、私がかなり正確であると確信している数字を私に与えています。私たちには約10,000人のユーザーがおり、これを変更して100個未満のタスクを持つユーザーを見つけ出すと、約2,000人がいると私に伝えます。しかし、1人のユーザーあたりのタスクの平均数は2.2です...どのように正しいことができますか?編集:それから私は100以上のタスクを持つユーザーを行うとき、それは82と言う...私たちの10,000人のユーザーの合計よりも少ない合計。 –

+0

申し訳ありません。あなたの質問によく合うように私の答えを編集しました。 –

0

私は、これは事前に1.9.2を動作するかどうかはわからないが、私は確かではないが、私はこれが働いているとは思わない

User.where(Task.count > 5).count 
+0

私は1.8.7で動作していませんでした。私を与えました:引数の数が間違っています(0の場合は1) –

関連する問題