Я не хочу сказать, что следующие варианты обязательно лучше, чем то, что предлагают Benj и Old Pro , но скорее хочу предоставить еще несколько альтернатив.
Первый использует метод includes
, так как это то, что запрашивал OP.Но так как includes
по умолчанию выберет все столбцы основной модели (User
), сначала нужно удалить этот выбор по умолчанию с помощью , за исключением метода :
User.includes(:ocr).except(:select).select(:id, 'ocr.small_value_only')
OfКонечно, было бы проще использовать join
.
Следующие параметры проистекают из моей неприязни к наличию строк в AR-запросах, так как они имеют тенденцию полагаться на знание вызываемой модели, которую AR должен фактически абстрагировать длявы, то есть имя таблицы базы данных (ocr
).
Наивной реализацией для удаления этих знаний является получение имени таблицы из модели:
User.joins(:ocr).select(:email, "`#{Ocr.table_name}`.`small_value_only`")
Следующая альтернативаполагается на слияние , чтобы избавиться от строки для выбора столбца:
User.joins(:ocr).merge(Ocr.select(:project_id)).select(:id)
Но поскольку полученный sql не ссылается на таблицу Ocr для small_value_only
, он будет эквивалентензапись:
User.joins(:ocr).select(:email, :small_value_only)
и будет работать только до тех пор, пока small_value_only
не существует в таблице users
.
Последняя альтернатива не имеет этого недостатка, но гораздо болееглаголose:
User.joins(:ocr).select(Ocr.select(:small_value_only).arel.projections).select(:id)