2017-04-21 3 views
0

Ich möchte eine erweiterte Active Record-Abfrage auf meine Modelle durch einen Join und zählen Sie alle Datensätze. Ich weiß nicht, ob es möglich ist, zu tun, was ich will, aber ich denke, dass es getan werden kann.Rails erweiterte Active Record-Abfrage

Ich möchte wissen, wie oft ein einzelnes Lied auf einer Radiostation gespielt wird. Ich habe folgendes versucht, aber es hat offensichtlich nicht funktioniert.

@top_songs = Song.joins(:radiostation).where("radiostations.id = ?", 1).order(total_counter: :desc) 

Ich spielte auch wenn die Generalplaylist Modell mit Gruppe aber der Nachteil ist, dass es einen Hash als Folge und nicht eine Active Beziehung gibt.

Generalplaylist.where("radiostation_id = ?", 1).group(:song_id).count 

Gibt es einen anderen Weg, um das Ergebnis zu erhalten?

Hier ist mein Modell für meine Radio Wiedergabelisten Website

generalplaylist.rb 

class Generalplaylist < ActiveRecord::Base 
    belongs_to :song 
    belongs_to :radiostation 
    belongs_to :artist 
end 

song.rb 

class Song < ActiveRecord::Base 
    has_many :generalplaylists 
    has_many :radiostations, through: :generalplaylists 
    belongs_to :artist 
end 

radiostaion.rb 

class Radiostation < ActiveRecord::Base 
    has_many :generalplaylists 
end 

class Artist < ActiveRecord::Base 
    has_many :generalplaylists 
    has_many :songs 
    has_many :radiostations, through: :generalplaylists 
end 

Antwort

0

Ein Active Beziehung gilt nicht wirklich, nachdem Sie gruppiert haben und gezählt.

Die Gruppe und die Anzahl werden Ihnen aggregierte Ergebnisse liefern, während eine ActiveRecord-Beziehung wirklich für den Fall entworfen wurde, wenn Sie auf Zeilenebene Zugriff auf einzelne Datensätze benötigen.

Also in diesem Fall ist ein Hash das gewünschte Ergebnis.

+0

Hallo Joshua, ich habe die Gruppe Methode am Ende mit und verarbeitet, um die Gruppe der Song-Details zu finden, dass ich Auf der Suche nach. Es schien das Beste für meine Situation zu sein. Danke für deine Hilfe! – Samuel

0

Wenn Sie eine ActiveRecord-Beziehung wünschen (obwohl Joshua darauf hinweist, dass Sie keine wirklich brauchen), können Sie Generalplaylist dafür verwenden. Angenommen, Sie sind ein specfic Song my_song zu einem bestimmten Radiosender zählen möchten my_radiostation Sie tun können ...

Generalplaylist.where(song: my_song, radiostation: my_radiostation).count 
+0

Danke Steve für deine Antwort. Ich benutzte die Gruppenmethode, da dies für meine Situation geeignet war. – Samuel

+0

Kein Problem, froh, dass Sie eine Lösung haben! – SteveTurczyn