Activerecord 从act as taggale中投影按标记筛选的表的单个列

Activerecord 从act as taggale中投影按标记筛选的表的单个列,activerecord,ruby-on-rails-5,arel,act-as-taggable-on,Activerecord,Ruby On Rails 5,Arel,Act As Taggable On,目前我知道在rails中进行子选择的唯一方法是使用arel, 对于exmaple- sub = x.where(y:'x').project(:id) select = a.where(a[:x_id].in(sub)) 问题是,, 如果x使用的是gem上的acts as taggable,并且需要通过特定标记进行过滤,请使用withtaged_with方法 我怎样才能仍然获得相同的数据库效率,它看起来像是用方法标记的覆盖了投影 谢谢,您不需要Arel在Rails中构建子选项: sub = X

目前我知道在rails中进行子选择的唯一方法是使用arel, 对于exmaple-

sub = x.where(y:'x').project(:id)
select = a.where(a[:x_id].in(sub))
问题是,, 如果x使用的是gem上的acts as taggable,并且需要通过特定标记进行过滤,请使用with
taged_with
方法

我怎样才能仍然获得相同的数据库效率,它看起来像是用方法标记的
覆盖了投影


谢谢,

您不需要Arel在Rails中构建子选项:

sub = X.where(y: 'x')
select = A.where(x_id: sub)
生成以下SQL,假设A的表名为
as
,X的表名为
xs

SELECT "as".* FROM "as" WHERE "as"."x_id" IN (SELECT "xs"."id" FROM "xs" WHERE "xs"."y" = 'x')
使用
tagged_with
worked:
A.where(x_id:x.tagged_with('my_tag'))
进行测试会生成预期的SQL,至少对于我测试过的Rails 5.1版本是如此

编辑

如果需要,可以指定子选择中使用的列。如果未指定,则主键列为默认值:

sub = X.where(y: 'x').select(:x_y_id)
select = A.where(x_id: sub)
将生成以下SQL:

SELECT "as".* FROM "as" WHERE "as"."x_id" IN (SELECT "xs"."x_y_id" FROM "xs" WHERE "xs"."y" = 'x')

看起来这是可行的,如果想要的列不是id列怎么办?假设它的x_y_id,我需要添加另一个查询吗?