投射由标签过滤的表的单个列作为taggale

问题描述 投票:0回答:1

目前,我知道在轨道中进行子选择的唯一方法是使用arel,例如 -

sub = x.where(y:'x').project(:id)
select = a.where(a[:x_id].in(sub))

问题是,如果x在gem上使用act作为标记,并且需要按特定标记过滤,请使用tagged_with方法。

我怎么能仍然达到相同的数据库效率,它看起来像tagged with方法覆盖投影。

谢谢,

activerecord ruby-on-rails-5 arel act-as-taggable-on
1个回答
1
投票

您不需要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进行测试: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')
© www.soinside.com 2019 - 2024. All rights reserved.