Да, вы можете сделать это:
User.joins(:projects).select(Arel.star, Subscription.arel_table[:project_id])
, что приведет к SQL-запросу, подобному этому:
SELECT *, "subscriptions"."project_id" FROM "users" INNER JOIN "subscriptions" ON "subscriptions"."user_ud" = "users"."id";
Если вы хотите указать конкретный проект (то есть использовать выражение), вы можете сделать это с помощью Arel следующим образом:
User.joins(:projects).select(Arel.star, Subscription.arel_table[:project_id].eq(42))
К сожалению, у вас не будет псевдонима имени столбца, и вы не можете вызвать as
для Arel ::Узлы :: Эквивалентность.Я не знаю достаточно о внутренностях Арела, чтобы выбраться из этой коробки.Но вы можете сделать это, если вам нужна компоновка Ареля (например, если это то, что должно работать с несколькими моделями или столбцами):
User.joins(:projects).select(Arel.star, Subscription.arel_table[:project_id].eq(42).to_sql + " as has_project")
Это немного неуклюже, но работаети предоставляет метод user.has_project
, который возвращает логическое значение.Вы можете сделать это так:
class User
scope :with_project_status, lambda do |project_id|
has_project =
Subscription.arel_table[:project_id].
eq(project_id).to_sql + " as has_project"
joins(:projects).select(Arel.star, has_project)
end
end
User.with_project_status(42).where(active: true)