投影按标记筛选的表的单列,以充当标记



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

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

问题是, 如果 X 在 Gem 上使用可标记的行为,并且需要按特定标记进行筛选,请使用 withtagged_with方法。

我怎么还能获得相同的数据库效率,看起来tagged 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进行测试有效: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')

相关内容

  • 没有找到相关文章

最新更新