sql >> Databasteknik >  >> RDS >> PostgreSQL

Table join sql to rails aktiv postfråga

Om du har en koppling mellan Review och Audio sedan något sånt här:

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

Det ger en lista med Review instanser i revs och dessa instanser kommer att ha extra avg_col1 och avg_col2 metoder för att komma åt medelvärdena såväl som den vanliga style /style_id metoder men de andra kolumnaccessormetoderna som Review normalt skulle erbjuda kommer att höja undantag.

Om du inte har anslutningarna inställda kan du göra JOIN manuellt:

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

Om allt du behöver är bara rådata utan all ActiveRecord-inpackning och overhead, kan du köra den råa SQL-en och hashifiera den för hand med 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

Det skulle ge dig en array av hash. Du kan till och med förenkla det tillvägagångssättet med Struct för att skapa enkla dataomslagsklasser:

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:Använd inte implicita kopplingsvillkor din SQL, det är bara ett snabbt och enkelt sätt att producera korsprodukter, använd explicita kopplingsvillkor:

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



  1. Index används inte på grund av typkonvertering?

  2. MySQL alias stenografi?

  3. Synkroniserad körning av lagrad procedur i mysql

  4. Lägg till dagar till ett datum i PostgreSQL