Еще лучше, используйте counter_cache
, что будет быстрее, потому что вы будете использовать только одну таблицу в своем запросе
Вот ваш класс песни:
class Song < ActiveRecord::Base
has_many :listens
def self.top
order('listens_count DESC').limit(5)
end
end
Тогда вашкласс прослушивания:
class Listen < ActiveRecord::Base
belongs_to :song, counter_cache: true
end
Убедитесь, что вы добавили миграцию:
add_column :comments, :likes_count, :integer, default: 0
Бонусные баллы, добавьте тест:
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
Или, если выхочу пойти с вышеупомянутым методом, здесь это немного проще, и с использованием метода класса, а не scope
def self.top
select('comments.*, COUNT(listens.id) AS listens_count').
joins(:listens).
group('comments.id').
order('listens_count DESC').
limit(5)
end