where子句中的嵌套关​​联不会生成有效的SQL

时间:2015-12-21 18:35:54

标签: ruby-on-rails activerecord

我有以下模特

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: self替换为user_id: id来修复,但我不明白为什么Active Record不能与user: self一起使用。这种行为是否记录在案?

1 个答案:

答案 0 :(得分:1)

Date date1 = new Date(); Date date2 = new Date(); if (DateUtils.truncatedCompareTo(date1, date2, Calendar.DAY_OF_MONTH) == 0) // TRUE else // FALSE 属于某个文档,因此在此上下文中,此部分查询无效:Request

来自documentation

  

在belongs_to关系的情况下,如果将ActiveRecord对象用作值,则可以使用关联键来指定模型。

这意味着,documents: { user: self }工作时,关系必须为self,以便您可以获取属于特定文档的请求。

belongs_to的作用原因是user: id表恰好有documents列。