Как бы вы сделали этот подзапрос Rails, используя Squeel?
Я хочу реструктурировать запрос ниже, используя Squeel. Я'Я хотел бы сделать это, чтобы я мог связать операторы в нем и повторно использовать логику в различных частях запроса.
User.find_by_sql("SELECT
users.*,
users.computed_metric,
users.age_in_seconds,
( users.computed_metric / age_in_seconds) as compound_computed_metric
from
(
select
users.*,
(users.id *2 ) as computed_metric,
(extract(epoch from now()) - extract(epoch from users.created_at) ) as age_in_seconds
from users
) as users")
Запрос должен работать в БД и не должен быть гибридным решением Ruby, поскольку он должен упорядочивать и разрезать миллионы записей.
поставил проблему так, чтобы она работала против нормальногоuser
и так, что вы можете играть с альтернативами ему.
User
объект со всеми нормальными атрибутамикаждый пользовательский объект должен также включать,extra_metric_we_care_about
age_in_seconds
а такжеcompound_computed_metric
запрос не должен дублировать какую-либо логику, просто распечатывая строку в нескольких местах - я хочу избежать повторения одного и того же[обновлено] Запрос должен быть выполним в БД, чтобы результирующий набор, который может состоять из миллионов записей, можно было упорядочить и разрезать в БД перед возвратом в Rails[обновлено] Решение должно работать для БД PostgresПример типа решения I 'мне нравитсяРешение ниже нене работает, но это показывает тип элегантности, которую яЯ надеюсь достичь
class User < ActiveRecord::Base
# this doesn't work - it just illustrates what I want to achieve
def self.w_all_additional_metrics
select{ ['*',
computed_metric,
age_in_seconds,
(computed_metric / age_in_seconds).as(compound_computed_metric)]
}.from{ User.w.compound_computed_metric.w_age_in_seconds }
end
def self.w_computed_metric
where{ '(id *2 ) as computed_metric' }
end
def self.w_age_in_seconds
where{ '(extract(epoch from now()) - extract(epoch from created_at) ) as age_in_seconds' }
end
end
Вы должны быть в состоянии запустить это против вашей существующей базы данныхОбратите внимание, что яМы несколько придумали проблему, чтобы вы могли использоватьUser
класс и играть с ним в вашей консоли.