PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Table join sql to rails query del record attivo

Se hai un'associazione tra Review e Audio quindi qualcosa del genere:

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

Questo darà un elenco di Review istanze in revs e quelle istanze avranno avg_col1 extra e avg_col2 metodi per accedere alle medie oltre al solito style /style_id metodi ma gli altri metodi di accesso di colonna che Review offrirebbe normalmente solleverebbe eccezioni.

Se non hai impostato le associazioni, puoi fare il 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')

Se tutto ciò di cui hai bisogno sono solo i dati grezzi senza tutto il wrapping e l'overhead di ActiveRecord, puoi eseguire l'SQL grezzo e hashizzarlo manualmente 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

Questo ti darebbe una serie di hash. Potresti anche semplificare questo approccio usando Struct per creare semplici classi di data wrapper:

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

PS:non utilizzare condizioni di join implicite nel tuo SQL, è solo un modo semplice e veloce per produrre prodotti incrociati, usa condizioni di join esplicite:

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