私は heroku/ rails/ pgsql 9.1.6 を使用しており、本当に単純なクエリであるべきだと思われる壁に頭をぶつけています。
ユーザーがまだ応答していない最近の「リクエスト」を表示したい
試行 1 (heroku/pgsql にプッシュする前に動作します):
Request.includes(:responses).where("(select count(responses.id)=0 WHERE responses.user=?) AND requests.created_at > ?", user_id, days_ago )
heroku にプッシュすると、そのクエリでエラーが発生します。
ActiveRecord::StatementInvalid: PGError: エラー: 集計は WHERE 句で許可されていません
試み2:「持っている」
StackOverflow で代わりに「Having」を試す必要があるというスレッドを見つけたので、次のように修正しました。
Request.includes(:responses).having("responses.user_id=? AND count(responses.id)=0", user_id).where("requests.created_at > ?", days_ago )
それは新しいエラーを生成しました。ActiveRecord::StatementInvalid: PGError: エラー:
列 "requests.id" は GROUP BY 句に指定するか、集計関数で使用する必要があります
試行 3:「グループ」
次に、そのクエリを次のように修正しました
Request.includes(:responses).group("requests.id").group("responses.id").having("responses.user_id=? AND count(responses.id)=0", user_id).where("requests.created_at > ?", days_ago )
これは実行されますが、値を返す必要があることがわかっている場合でも空のセットを返します。
最良の推測:
この時点での問題は 2 部分の has 句にあり、現在の形式では、応答していないユーザーを誤って除外していると思われます (したがって、常に空のセットになります)。
例
having("responses.user_id=? AND count(responses.id)=0", user_id)
:
元の埋め込み選択とは対照的に:
select count(responses.id)=0 WHERE response.user=?
しかし、応答していないユーザーを表示するには、having 句の正しい形式がどうあるべきかわかりません。
助けてくれてありがとう!