Como você faria essa subconsulta do Rails usando o Squeel?

Eu quero reestruturar a consulta abaixo usando Squeel. Eu gostaria de fazer isso para que eu possa encadear os operadores e reutilizar a lógica nas diferentes partes da consulta.

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")

A consulta deve operar no banco de dados e não deve ser uma solução Ruby híbrida, já que tem que ordenar e fatiar milhões de registros.

Eu configurei o problema para que ele pudesse ser executadouser mesa e para que você possa jogar com as alternativas para isso.

Restrições a uma resposta aceitávela consulta deve retornar umUser objeto com todos os atributos normaiscada objeto de usuário também deve incluirextra_metric_we_care_about, age_in_seconds ecompound_computed_metrica consulta não deve duplicar qualquer lógica apenas imprimindo uma string em vários lugares - eu quero evitar fazer a mesma coisa duas vezes[atualizado] A consulta deve ser possível no banco de dados para que um conjunto de resultados que pode consistir em milhões de registros possa ser solicitado e fatiado no banco de dados antes de retornar ao Rails.[updated] A solução deve funcionar para um Postgres DBExemplo do tipo de solução que eu gostaria

A solução abaixo não funciona, mas mostra o tipo de elegância que eu espero alcançar

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
Você deve conseguir executar isso no banco de dados existente

Por favor, note que eu tenho um pouco inventou o problema para que você possa usar o seu existenteUser classe e brincar com ele em seu console.

EDITARO banco de dados que estou usando é o Postgres.Não tenho certeza se deixei claro que a consulta deve ser executada no banco de dados. Não pode ser uma resposta híbrida, uma vez que parte da lógica é essencialmente feita no Rails. Isso é importante, pois quero poder ordenar e fatiar milhões de registros usando as colunas computadas.

questionAnswers(3)

yourAnswerToTheQuestion