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

时间:2018-01-20 01:27:48

标签: ruby-on-rails ruby-on-rails-4 single-table-inheritance

我在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

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

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

这会返回以下错误:

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

由于注释和文件夹都从Item继承,因此只有一个items表,我无法从includes文件夹中删除它。

如果我这样做:

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

它返回音符的名称而不是属于的文件夹(因为Note和Folder都从Item继承并位于items表中)。是否有某种方法可以从已包含的文件夹中获取而不是注释?

1 个答案:

答案 0 :(得分:1)

在幕后,SQL必须两次引用同一个表。因此,它在查询中有两个不同的名称。您需要确定Rails用于第二个参考的名称。

使用user.notes.joins(:folder).to_sql确定要使用的表名称。

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

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