私の Rails アプリでは、プロジェクトは割り当てによってユーザーに割り当てられます。ここで、特定のユーザーの割り当てられていないプロジェクトを取得したいと考えています。SQL クエリ:
SELECT * FROM projects WHERE id NOT IN (SELECT project_id FROM assignments WHERE user_id = 1
PgAdmin に入力すると、ユーザー 1 の割り当てられていないすべてのプロジェクトが一覧表示されます。
これが私のレールコードです:
class User < ActiveRecord::Base
has_many :assignments, dependent: :destroy
has_many :assigned_projects, through: :assignments, source: :project
has_many :unassigned_projects, :class_name => 'Project', :finder_sql => proc {
["SELECT * FROM projects WHERE id NOT IN (SELECT project_id FROM assignments WHERE user_id = ? )", self.id]
}
これにより、次のことが発生します。
ActiveRecord::StatementInvalid - PG::Error: ERROR: column projects.user_id does not exist
LINE 1: SELECT 1 AS one FROM "projects" WHERE "projects"."user_id" = $1
正しい列は「assignments.user_id」になるため、これは当然のことです。どうやら Rails は 2 番目の FROM を尊重しません。コードの何が問題になっていますか?
更新: 「unassigned_projects」-CollectionProxy を調べると、含まれているはずのものが正確に含まれていることがわかります。ということで、まずは正しく組み立てられたようです。ただし、その後、次の呼び出し時に PG でエラーが発生します。
if @unassigned_projects.any?
ただし、次の場合はそうではありません。
if @assigned_projects.any?