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