投影 table 的单个列,按标签过滤,作为标签
Project a single column of a table filtered by tag from act as taggale
目前我知道在 rails 中子 select 的唯一方法是使用 arel,
例如 -
sub = x.where(y:'x').project(:id)
select = a.where(a[:x_id].in(sub))
问题是,
如果 x 在 gem 上使用 acts as taggable 并且需要通过特定标签进行过滤,请使用 with tagged_with
方法。
我怎样才能达到相同的数据库效率,看起来 tagged with
方法覆盖了投影。
谢谢,
您不需要 Arel 在 Rails 中构建子选择:
sub = X.where(y: 'x')
select = A.where(x_id: sub)
生成以下 SQL,假设 A 的 table 名称为 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')
目前我知道在 rails 中子 select 的唯一方法是使用 arel, 例如 -
sub = x.where(y:'x').project(:id)
select = a.where(a[:x_id].in(sub))
问题是,
如果 x 在 gem 上使用 acts as taggable 并且需要通过特定标签进行过滤,请使用 with tagged_with
方法。
我怎样才能达到相同的数据库效率,看起来 tagged with
方法覆盖了投影。
谢谢,
您不需要 Arel 在 Rails 中构建子选择:
sub = X.where(y: 'x')
select = A.where(x_id: sub)
生成以下 SQL,假设 A 的 table 名称为 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')