0

私の 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?
4

2 に答える 2

1
["SELECT * FROM project WHERE id NOT IN (SELECT project_id FROM assignements a WHERE a.user_id = ?)", self.id]

projectsまた、テーブルの代わりに名前を付けるべきではありませんprojectか? RoR は通常、テーブル名に複数形を使用します。

最後に、正しい綴りはおそらくassignments、余分な 'e' を除いたものです。

于 2013-07-31T13:23:21.307 に答える
0

これに対処する最も効率的な方法は、非推奨の has_many-finder_sql-definition を User のクラス メソッドに置き換えることであることがわかりました。

def unassigned_projects
  Project.where.not(id: self.assigned_projects.collect(&:id))
end
于 2013-11-03T17:39:11.233 に答える