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

Tabel join sql to rails aktiv postforespørgsel

Hvis du har en tilknytning mellem Review og Audio så noget som dette:

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

Det vil give en liste over Review forekomster i revs og disse forekomster vil have ekstra avg_col1 og avg_col2 metoder til at få adgang til gennemsnittet samt den sædvanlige style /style_id metoder, men de andre kolonneaccessormetoder, der Review normalt ville tilbyde vil rejse undtagelser.

Hvis du ikke har oprettet foreningerne, kan du gøre JOIN manuelt:

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

Hvis alt, hvad du behøver, kun er de rå data uden al ActiveRecord-indpakningen og overhead, så kan du udføre den rå SQL og hashificere den i hånden ved hjælp af 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 ville give dig en række hashes. Du kan endda forenkle denne tilgang ved at bruge Struct for at oprette simple dataindpakningsklasser:

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:Brug ikke implicitte joinbetingelser din SQL, det er bare en hurtig og nem måde at producere krydsprodukter på, brug eksplicitte joinbetingelser:

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



  1. SQL-forespørgsel for at skjule duplikerede værdier efter datointerval

  2. Hvad er de vigtigste ydelsesforskelle mellem varchar og nvarchar SQL Server-datatyper?

  3. Indsæt en række og undgå løbstilstand (PHP/MySQL)

  4. Parsing af ekstremt store XML-filer i php