Я думаю, что результирующий вызов ActiveRecord может быть улучшен.
Но я бы сначала начал улучшать исходный SQL-запрос.
Подзапрос
SELECT DISTINCT ON (title) products.title, products.* FROM products
(я думаю, чтовместо meals
должен быть products
?) дубликат products.title
, который там не нужен.Хуже того, он пропускает предложение ORDER BY.Как сказано в документации PostgreSQL :
Обратите внимание, что «первая строка» каждого набора непредсказуема, если только ORDER BY не используется для того, чтобы требуемая строка появилась первой
Я бы переписал подзапрос следующим образом:
SELECT DISTINCT ON (title) * FROM products ORDER BY title ASC
, который дает нам вызов:
Product.select('DISTINCT ON (title) *').order(title: :asc)
В основном запросе where
вызовы используют сгенерированный Rails псевдоним дляsubquery
.Я бы не стал полагаться на внутреннее соглашение Rails о псевдонимах подзапросов, поскольку оно может измениться в любое время.Если вы не принимаете это во внимание, вы можете объединить эти условия в одном вызове where
с синтаксисом аргументов в стиле хеш-функции.
Окончательный результат:
Product.select('*')
.from(Product.select('DISTINCT ON (title) *').order(title: :asc))
.where(subquery: { active: true, meal_type_id: 1 })
.order('created_at DESC')