From ff38f272dc3dae033ded9c886fd57ca3994b00ff Mon Sep 17 00:00:00 2001 From: Aaro Koivukangas Date: Mon, 18 Dec 2023 08:04:09 +0200 Subject: [PATCH] made a better ratings page --- app/models/beer.rb | 4 ++ app/models/brewery.rb | 4 ++ app/models/concerns/rating_average.rb | 4 +- app/models/rating.rb | 2 + app/models/user.rb | 8 ++++ app/views/ratings/index.html.erb | 60 +++++++++++++++++++++++++-- 6 files changed, 77 insertions(+), 5 deletions(-) diff --git a/app/models/beer.rb b/app/models/beer.rb index 9c13003..4ccd161 100644 --- a/app/models/beer.rb +++ b/app/models/beer.rb @@ -12,4 +12,8 @@ class Beer < ApplicationRecord def to_s "#{name}, #{(Brewery.find_by_id brewery_id).name}" end + + def self.top n + sorted_by_rating_in_desc_order = Beer.all.sort_by{ |b| b.average_rating }.reverse.take(n) + end end diff --git a/app/models/brewery.rb b/app/models/brewery.rb index a48d792..9c84a54 100644 --- a/app/models/brewery.rb +++ b/app/models/brewery.rb @@ -25,4 +25,8 @@ class Brewery < ApplicationRecord self.year = 2023 puts "changed year to 2023" end + + def self.top n + sorted_by_rating_in_desc_order = Brewery.all.sort_by{ |b| b.average_rating }.reverse.take(n) + end end diff --git a/app/models/concerns/rating_average.rb b/app/models/concerns/rating_average.rb index a9f2064..55a9688 100644 --- a/app/models/concerns/rating_average.rb +++ b/app/models/concerns/rating_average.rb @@ -3,7 +3,7 @@ module RatingAverage def average_rating if instance_of?(Beer) - ratings = [self] + ratings = self.ratings elsif instance_of?(Brewery) # creates empty arrays for beers that have no ratings # + wraps the array in an array @@ -14,7 +14,7 @@ module RatingAverage raise "Wrong class type for calculating average, #{self.class}" end - return 0 unless ratings.count > 0 + return 0 unless ratings && ratings.count > 0 ratings.map(&:score).sum / ratings.count.to_f end diff --git a/app/models/rating.rb b/app/models/rating.rb index ccd4548..8405cbb 100644 --- a/app/models/rating.rb +++ b/app/models/rating.rb @@ -6,6 +6,8 @@ class Rating < ApplicationRecord less_than_or_equal_to: 50, only_integer: true } + scope :recent, -> { Rating.order(created_at: :desc) } + def to_s "#{beer.name}: #{score}" end diff --git a/app/models/user.rb b/app/models/user.rb index d8432e2..51b37b0 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -66,4 +66,12 @@ class User < ApplicationRecord end highest[:name] end + + def self.top n + sorted_by_rating_in_desc_order = User.all.sort_by{ |b| b.average_rating }.reverse.take(n) + end + + def self.most_active n + sorted_by_rating_count_in_desc_order = User.all.sort_by{ |b| b.count_ratings }.reverse.take(n) + end end diff --git a/app/views/ratings/index.html.erb b/app/views/ratings/index.html.erb index ef5e70e..02ae9ba 100644 --- a/app/views/ratings/index.html.erb +++ b/app/views/ratings/index.html.erb @@ -1,15 +1,69 @@

List of ratings

There is <%= pluralize @ratings.count, "rating" %>

-