73b194304e | ||
---|---|---|
lib | ||
spec | ||
.gitignore | ||
.rubocop.yml | ||
.rubocop_todo.yml | ||
.ruby-gemset | ||
.ruby-version | ||
.travis.yml | ||
CHANGELOG.md | ||
Gemfile | ||
Gemfile.lock | ||
LICENSE | ||
README.md | ||
Rakefile | ||
rating.gemspec |
README.md
Rating
A true Bayesian rating system with cache enabled.
JS Rating?
This is Raty: https://github.com/wbotelhos/raty 🌟
Description
Rating uses the know as "True Bayesian Estimate" inspired on IMDb rating with the following formula:
(WR) = (v ÷ (v + m)) × R + (m ÷ (v + m)) × C
IMDb Implementation:
WR
: weighted rating
R
: average for the movie (mean) = (Rating)
v
: number of votes for the movie = (votes)
m
: minimum votes required to be listed in the Top 250
C
: the mean vote across the whole report
Rating Implementation:
WR
: weighted rating
R
: average for the resource
v
: number of votes for the resource
m
: average of the number of votes
C
: the average rating based on all resources
Install
Add the following code on your Gemfile
and run bundle install
:
gem 'rating'
Run the following task to create a Rating migration:
rails g rating:install
Then execute the migrations to create the to create tables rating_rates
and rating_ratings
:
rake db:migrate
Usage
Just add the callback rating
to your model:
class User < ApplicationRecord
rating
end
Now this model can vote or be voted.
rate
You can vote on some resource:
author = User.last
resource = Article.last
author.rate(resource, 3)
rating
A voted resource exposes a cached data about it state:
resource = Article.last
resource.rating
It will return a Rating
object that keeps:
average
: the normal mean of votes;
estimate
: the true Bayesian estimate mean value (you should use this over average);
sum
: the sum of votes for this resource;
total
: the total of votes for this resource.
rate_for
You can retrieve the rate of some author gave to some resource:
author = User.last
resource = Article.last
author.rate_for resource
It will return a Rate
object that keeps:
author
: the author of vote;
resource
: the resource that received the vote;
value
: the value of the vote.
rated?
Maybe you want just to know if some author already rated some resource and receive true
or false
:
author = User.last
resource = Article.last
author.rated? resource
rates
You can retrieve all rates made by some author:
author = User.last
author.rates
It will return a collection of Rate
object.
rated
In the same way you can retrieve all rates that some author received:
author = User.last
author.rated
It will return a collection of Rate
object.
order_by_rating
You can list resource ordered by rating data:
Article.order_by_rating
It will return a collection of resource ordered by estimate desc
as default.
The order column and direction can be changed:
Article.order_by_rating :average, :asc
It will return a collection of resource ordered by Rating
table data.