181 lines
3.3 KiB
Markdown
181 lines
3.3 KiB
Markdown
|
# Rating
|
|||
|
|
|||
|
[![Build Status](https://travis-ci.org/wbotelhos/rating.svg)](https://travis-ci.org/wbotelhos/rating)
|
|||
|
[![Gem Version](https://badge.fury.io/rb/rating.svg)](https://badge.fury.io/rb/rating)
|
|||
|
|
|||
|
A true Bayesian rating system with cache enabled.
|
|||
|
|
|||
|
## JS Rating?
|
|||
|
|
|||
|
This is **Raty**: https://github.com/wbotelhos/raty :star2:
|
|||
|
|
|||
|
## Description
|
|||
|
|
|||
|
Rating uses the know as "True Bayesian Estimate" inspired on [IMDb rating](http://www.imdb.com/help/show_leaf?votestopfaq) 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 (mean) = (Rating)
|
|||
|
|
|||
|
`v`: number of votes for the movie = (votes)
|
|||
|
|
|||
|
`m`: average of the number of votes
|
|||
|
|
|||
|
`C`: the mean vote across the whole report
|
|||
|
|
|||
|
## Install
|
|||
|
|
|||
|
Add the following code on your `Gemfile` and run `bundle install`:
|
|||
|
|
|||
|
```ruby
|
|||
|
gem 'rating'
|
|||
|
```
|
|||
|
|
|||
|
Run the following task to create a Rating migration:
|
|||
|
|
|||
|
```bash
|
|||
|
rails g rating:install
|
|||
|
```
|
|||
|
|
|||
|
Then execute the migrations to create the to create tables `rating_rates` and `rating_ratings`:
|
|||
|
|
|||
|
```bash
|
|||
|
rake db:migrate
|
|||
|
```
|
|||
|
|
|||
|
## Usage
|
|||
|
|
|||
|
Just add the callback `rating` to your model:
|
|||
|
|
|||
|
```ruby
|
|||
|
class User < ApplicationRecord
|
|||
|
rating
|
|||
|
end
|
|||
|
```
|
|||
|
|
|||
|
Now this model can vote or be voted.
|
|||
|
|
|||
|
### rate
|
|||
|
|
|||
|
You can vote on some resource:
|
|||
|
|
|||
|
```ruby
|
|||
|
author = User.last
|
|||
|
resource = Article.last
|
|||
|
|
|||
|
author.rate(resource, 3)
|
|||
|
```
|
|||
|
|
|||
|
### rating
|
|||
|
|
|||
|
A voted resource exposes a cached data about it state:
|
|||
|
|
|||
|
```ruby
|
|||
|
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:
|
|||
|
|
|||
|
```ruby
|
|||
|
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`:
|
|||
|
|
|||
|
```ruby
|
|||
|
author = User.last
|
|||
|
resource = Article.last
|
|||
|
|
|||
|
author.rated? resource
|
|||
|
```
|
|||
|
|
|||
|
### rates
|
|||
|
|
|||
|
You can retrieve all rates made by some author:
|
|||
|
|
|||
|
```ruby
|
|||
|
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:
|
|||
|
|
|||
|
```ruby
|
|||
|
author = User.last
|
|||
|
|
|||
|
author.rated
|
|||
|
```
|
|||
|
|
|||
|
It will return a collection of `Rate` object.
|
|||
|
|
|||
|
### order_by_rating
|
|||
|
|
|||
|
You can list resource ordered by rating data:
|
|||
|
|
|||
|
```ruby
|
|||
|
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:
|
|||
|
|
|||
|
```ruby
|
|||
|
Article.order_by_rating :average, :asc
|
|||
|
```
|
|||
|
|
|||
|
It will return a collection of resource ordered by `Rating` table data.
|
|||
|
|
|||
|
## Love it!
|
|||
|
|
|||
|
Via [PayPal](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=X8HEP2878NDEG&item_name=rating) or [Gratipay](https://gratipay.com/rating). Thanks! (:
|