sql >> Base de Datos >  >> RDS >> PostgreSQL

Table join sql to rails consulta de registro activo

Si tiene una asociación entre Review y Audio entonces algo como esto:

revs = Review.joins(:audios)
             .group('style_id')
             .select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')

Eso dará una lista de Review instancias en revs y esas instancias tendrán avg_col1 adicional y avg_col2 métodos para acceder a los promedios, así como al habitual style /style_id pero los otros métodos de acceso a columnas que Review normalmente ofrecería generará excepciones.

Si no tiene las asociaciones configuradas, puede hacer JOIN manualmente:

revs = Review.joins('join audios on reviews.consumer_id = audios.consumer_id')
             .group('style_id')
             .select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')

Si todo lo que necesita son los datos sin procesar sin todo el ajuste y la sobrecarga de ActiveRecord, puede ejecutar el SQL sin procesar y convertirlo en hash a mano usando select_rows :

Review.connection.select_rows(%q{
    select r.style_id, avg(a.col1), avg(a.col2')
    from reviews r
    join audios  a on r.consumer_id = a.consumer_id
    group by r.style_id
}).map do
  { :style_id => r.shift, :avg_col1 => r.shift.to_f, :avg_col2 => r.shift.to_f }
end

Eso te daría una matriz de hashes. Incluso podría simplificar ese enfoque usando Struct para crear clases contenedoras de datos simples:

c    = Struct.new(:style_id, :avg_col1, :avg_col2)
revs = Review.connection.select_rows(%q{...}).map do |r|
  c.new(r.shift, r.shift.to_f, r.shift.to_f)
end

PD:no use condiciones de unión implícitas en su SQL, esa es solo una forma rápida y fácil de producir productos cruzados, use condiciones de unión explícitas:

SELECT ...
  FROM reviews JOIN audios ON reviews.consumer_id = audios.consumer_id
 GROUP BY style_id