2015-12-21 29 views
1

我有以下型號嵌套協會不會產生有效的SQL

class User < ActiveRecord::Base 
    has_many :documents 
    has_many :requests 
end 

class Document < ActiveRecord::Base 
    has_many :requests 
    belongs_to :user 
end 

class Request < ActiveRecord::Base 
    belongs_to :document 
    belongs_to :requester, class_name: 'User', foreign_key: 'user_id' 
end 

基本上,有哪些可以有很多文檔的用戶。用戶可以請求訪問其他用戶的文檔。

現在我想獲取發送給用戶的具有特定狀態的請求列表。

User方法執行此查詢不起作用

Request.includes(:document) 
     .where(status: Request::SOME_STATUS, documents: { user: self }) 

我得到錯誤

ERROR: column documents.user does not exist 

顯然,它可以通過與user_id: id更換user: self是固定的,但我不明白爲什麼Active Record不適用於user: self。此行爲是否記錄在案?

回答

1

一個Request屬於一個文件,所以您的查詢的這部分無效在這種情況下:documents: { user: self }

documentation

在一個belongs_to的關係,關聯鍵的情況下可以用來指定模型,如果一個ActiveRecord對象被用作值。

它所意味的是,self工作,這種關係必須是belongs_to這樣你就可以獲取屬於特定文檔的請求。

原因user: id的工作原理是因爲documents表碰巧有一個user_id列。