使用 STI 时是否可以从包含关联中提取?

Is it possible to pluck from an includes association when using STI?

我在 Rails 4 中有以下使用单一 Table 继承 (STI) 的模型:

class User < ActiveRecord::Base
  has_many :notes
end

class Item < ActiveRecord::Base
end

#inherits from Item
class Folder < Item
  belongs_to :folder
end

#inherits from Item
class Note < Item
  belongs_to :folder
end

我想执行以下查询,它应该提取笔记的 ID 和它所属的文件夹的名称。

user = User.first
user.notes.includes(:folder).pluck(:id, :'folders.name').first

此returns以下错误:

ERROR:  missing FROM-clause entry for table "folders"

由于笔记和文件夹都继承自 Item,因此只有一项 table,我无法将其从 includes 文件夹中提取出来。

如果我这样做:

user = User.first
user.notes.includes(:folder).pluck(:id, :'items.name').first

它 returns 笔记的名称而不是所属的文件夹(因为笔记和文件夹都继承自 Item 并且在项目 table 中)。有什么方法可以从包含的文件夹中提取而不是注释?

在幕后,SQL 必须引用相同的 table 两次。因此它在查询中有两个不同的名称。您需要弄清楚 Rails 用于第二个引用的名称。

使用 user.notes.joins(:folder).to_sql 找出要使用的 table 名称。

可能类似于 folders_items,所以也许试试这个:

user.notes.joins(:folder).pluck(:id, 'folders_items.name').first