2013-07-31 84 views
0

在我的rails應用程序中,項目通過賦值分配給用戶。現在我想爲特定用戶檢索未分配的項目。 SQL查詢:Rails 4/Ruby2/PG9.3:ActiveRecord在SQL子查詢中混淆表

SELECT * FROM projects WHERE id NOT IN (SELECT project_id FROM assignments WHERE user_id = 1

列出了所有在pgAdmin的進入時未分配項目用戶1。

這裏是我的Rails代碼:

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不尊重第二個FROM。我的代碼有什麼問題?

更新: 檢查了「unassigned_projects」 -CollectionProxy顯示,它包含究竟什麼是應該遏制。所以它似乎是第一次正確組裝。然而,後來PG引發錯誤,當調用:

if @unassigned_projects.any? 

但如果調用:

if @assigned_projects.any? 

回答

0

好吧,我發現,處理這個最有效的方法是使用一個類的方法,以取代過時的has_many-finder_sql定義爲用戶:

def unassigned_projects 
    Project.where.not(id: self.assigned_projects.collect(&:id)) 
end 
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'。

+0

謝謝你。你的回答可能指向正確的方向。我相應地更改了查詢,但仍然收到相同的錯誤消息。關於拼寫:我不是母語爲英語的人,拼錯「任務」;-)。當然,這個表格是名稱「項目」。失蹤的「s」只是一個錯字。我編輯我的帖子來解決這個問題。 – AWM