Как бы вы сделали этот подзапрос 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Пример типа решения, которое я хотел бы

Приведенное ниже решение не работает, но показывает тип элегантности, которого я надеюсь достичь

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 класс и играть с ним в вашей консоли.

РЕДАКТИРОВАТЬБД, которую я использую - это Postgres.Я не уверен, что на 100% ясно дал понять, что все запросы должны выполняться в БД. Это не может быть гибридный ответ, если некоторая логика по существу сделана в Rails. Это важно, так как я хочу иметь возможность упорядочивать и разрезать миллионы записей, используя вычисляемые столбцы.

Ответы на вопрос(3)

Ваш ответ на вопрос