Проецировать один столбец таблицы, отфильтрованный по тегу, из тега действовать - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я знаю только один способ выбора sub в рельсах, используя arel, для примера -

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

вопрос в том, если x использует действует как тег для gem и его необходимо отфильтровать по определенному тегу, используйте метод tagged_with.

Как я могу достичь той же эффективности базы данных, похоже, что метод tagged with переопределяет проекцию.

спасибо,

1 Ответ

0 голосов
/ 12 сентября 2018

Вам не нужно, чтобы 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')
...