2016-12-14 2 views
0

J'utilise la gemme Sequel pour me connecter à ma base de données Postgres - J'ai Playlists et Tracks, qui ont une relation many_to_many.Comment faire pour interroger many_to_many associations avec Sequel gem et Postgres

J'ai du mal à faire le tour de la façon la plus efficace d'interroger les 10 pistes les plus fréquemment vues sur les playlists. Quelqu'un peut-il me donner un exemple de la façon de retirer cela?

+0

S'il vous plaît montrer un exemple de données, «commander par ... limite» –

Répondre

0

probablement préférable d'utiliser un modèle pour la table de jointure:

class PlaylistTrack < Sequel::Model(:playlists_tracks) 
    many_to_one :playlist 
    many_to_one :track 

    def self.top10_tracks 
    group_and_count(:track_id). 
     reverse(:count). 
     limit(10). 
     eager(:track). 
     all. 
     map(&:track) 
    end 
end 

Notez que cela fait deux requêtes, mais il fait que le tableau résultant des pistes est ordonnée par popularité.

Si vous le souhaitez, vous pouvez le faire en une seule requête sans un modèle de table de jointure:

def Track.top10 
    join(:playlists_tracks, :track_id=>:id). 
    group{tracks[:id]}. 
    select_all(:tracks). 
    select_append{count(tracks[:id])}. 
    order{count(tracks[:id]).desc}. 
    limit(10). 
    all 
end 

Notez que celui-ci utilise SQL non standard, car il sélectionne les expressions non globales que vous n'êtes pas regrouper par, mais cela fonctionne dans PostgreSQL. Vous pourriez avoir ce travail avec SQL standard en regroupant par toutes les colonnes dans la table des pistes.