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 @@
There is <%= pluralize @ratings.count, "rating" %>
-| Beer | +Rating | +
|---|---|
| <%= beer.name %> | +<%= beer.average_rating %> | +
| Brewery | +Rating | +
|---|---|
| <%= brewery.name %> | +<%= brewery.average_rating %> | +
<%= link_to "New rating", new_rating_path, class:"btn btn-primary" %>