Mieux encore, utiliser counter_cache
qui sera plus rapide parce que vous aurez seulement parce que l'utilisation d'une table dans votre requête
Ici est votre chanson de la classe:
class Song < ActiveRecord::Base
has_many :listens
def self.top
order('listens_count DESC').limit(5)
end
end
Alors, à votre écoute classe:
class Listen < ActiveRecord::Base
belongs_to :song, counter_cache: true
end
Assurez-vous d'ajouter une migration:
add_column :comments, :likes_count, :integer, default: 0
Les points de Bonus, ajouter le test:
describe '.top' do
it 'shows most listened songs first' do
song_one = create(:song)
song_three = create(:song, listens_count: 3)
song_two = create(:song, listens_count: 2)
popular_songs = Song.top
expect(popular_songs).to eq [song_three, song_two, song_one]
end
end
Ou, si vous voulez aller avec la méthode ci-dessus, ici c'est un peu plus simplement, et à l'aide d'une méthode de classe plutôt que d' scope
def self.top
select('comments.*, COUNT(listens.id) AS listens_count')
joins(:listens).
group('comments.id').
order('listens_count DESC').
limit(5)
end