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

Dav*_*dP6 5 ruby-on-rails single-table-inheritance ruby-on-rails-4

我在 Rails 4 中有以下使用单表继承 (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
Run Code Online (Sandbox Code Playgroud)

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

user = User.first
user.notes.includes(:folder).pluck(:id, :'folders.name').first
Run Code Online (Sandbox Code Playgroud)

这将返回以下错误:

ERROR:  missing FROM-clause entry for table "folders"
Run Code Online (Sandbox Code Playgroud)

由于笔记和文件夹都继承自 Item,因此只有一个项目表,我无法从包含文件夹中提取它。

如果我做:

user = User.first
user.notes.includes(:folder).pluck(:id, :'items.name').first
Run Code Online (Sandbox Code Playgroud)

它返回笔记的名称,而不是所属的文件夹(因为笔记和文件夹都继承自 Item 并且都在项目表中)。有没有办法从包含的文件夹而不是笔记中提取?

Nat*_*han 6

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

使用user.notes.joins(:folder).to_sql什么表名,找出使用。

它可能是这样的folders_items,所以也许试试这个:

user.notes.joins(:folder).pluck(:id, 'folders_items.name').first
Run Code Online (Sandbox Code Playgroud)