В условиях «веб два ноль» очень актуален вопрос рейтингов, плюсиков, звездочек, кармы и прочих систем самоутверждния. Если правильно подойти к этой теме — то рейтинги — это очень крутая, необходимая вещь. Сейчас уже многие понимают, что рейтинг это не только банальное накручивание плюсиков/минусиков, но так же и скрытая для глаз пользовательская активность, авторитетность автора и все такое. Хорошую статью на этут тему написал alfa.
Но я бы хотел обсудить только стандартные средства, которые имеет rails сообщество. Речь о плагинах. Погуглив 10 минут я нашел лишь два. Ни один меня не устроил =).
В любом случае вот краткий обзор этих плагинов (это скорее переведенные выдержки из обзоров — я этими плагинами не пользовался и не планирую). Пожалуйста, скидывайте ваш опыт и ссылки на прочие достижение плагиносоздателей в комментарии.
Ссылки по теме:
devblog.famundo.com/articles/2007/02/04/a-new-rails-plugin-acts_as_rated
www.rubynaut.net/articles/2007/03/18/rails_ajax_rating_system_part_1
rubyforge.org/projects/acts-as-rated
Основное заявленное достоинство плагина — множество настраиваемых опций и кеширование, что сокращает количество обращений к базе.
script/plugin install svn://rubyforge.org/var/svn/acts-as-rated/trunk/acts_as_rated
Плагин идет сразу с пачкой миграций, что упращает его добавление в любой проект. Так же включены тесты.
* Встраивание в любую модель
* Данные рейтинга можно хранить как во внешней таблице, так и непосредственно в бд модели
* Ограничение пределов оценки
* Подсчет средней и общей оценки и количества голосов
* Поиск объектов по рейтингу или границам рейтинга, а также по рейтингующему
Ссылки по теме:
satishchauhan.wordpress.com/2007/08/24/star-rating-in-ruby-on-rails
www.naffis.com/2006/8/31/rails-ajax-star-rating-system
rubyforge.org/projects/rateableplugin
script/plugin install svn://rubyforge.org/var/svn/rateableplugin/trunk
миграция
script/generate migration add_ratings
* Встраиваится в любую модель
методы
* rate(int) — оценивает объект
* rating= — то же самое
* rating — возвращает рейтинг объекта
* find_all_by_rating — возвращает все объекты, выполняющие условие
* find_by_rating — возвращает первый объект, выполняющий условие
Данные два представителя весьма ограничены и справляются лишь с задачей дать человеку возможность сказать хорошо/плохо. Это конечно уже что-то, но явно не достаточно. Поэтому вывод — писать что-то свое.
Но я бы хотел обсудить только стандартные средства, которые имеет rails сообщество. Речь о плагинах. Погуглив 10 минут я нашел лишь два. Ни один меня не устроил =).
В любом случае вот краткий обзор этих плагинов (это скорее переведенные выдержки из обзоров — я этими плагинами не пользовался и не планирую). Пожалуйста, скидывайте ваш опыт и ссылки на прочие достижение плагиносоздателей в комментарии.
Acts_as_rated
Ссылки по теме:
devblog.famundo.com/articles/2007/02/04/a-new-rails-plugin-acts_as_rated
www.rubynaut.net/articles/2007/03/18/rails_ajax_rating_system_part_1
rubyforge.org/projects/acts-as-rated
Основное заявленное достоинство плагина — множество настраиваемых опций и кеширование, что сокращает количество обращений к базе.
Установка
script/plugin install svn://rubyforge.org/var/svn/acts-as-rated/trunk/acts_as_rated
Пример использования
class Book < ActiveRecord::Base
acts_as_rated
end
u = User.find_by_name "guy"
b = Book.find "Catch 22"
b.rate 5, u
u = User.find_by_name "john"
b.rate 3, u
b.rating_average # => 4
Book.find_by_rating 2..3 # => [<Book:"Catch 22">]
b.find_rated_by User.find_by_name("guy") # => [<Book:"Catch 22">]
Плагин идет сразу с пачкой миграций, что упращает его добавление в любой проект. Так же включены тесты.
Основные функции
* Встраивание в любую модель
* Данные рейтинга можно хранить как во внешней таблице, так и непосредственно в бд модели
* Ограничение пределов оценки
* Подсчет средней и общей оценки и количества голосов
* Поиск объектов по рейтингу или границам рейтинга, а также по рейтингующему
Acts_as_rateable
Ссылки по теме:
satishchauhan.wordpress.com/2007/08/24/star-rating-in-ruby-on-rails
www.naffis.com/2006/8/31/rails-ajax-star-rating-system
rubyforge.org/projects/rateableplugin
Установка
script/plugin install svn://rubyforge.org/var/svn/rateableplugin/trunk
миграция
script/generate migration add_ratings
def self.up
create_table :ratings do |t|
t.column :rating, :integer # You can add a default value here if you wish
t.column :rateable_id :integer, :null => false
t.column :rateable_type, :string, :null => false
end
end
def self.down
drop_table :ratings
end
Пример использования
class SillyWalk < ActiveRecord::Base
# attributes: name, inventor
acts_as_rateable
end
SillyWalk.new(:name => "Not Very Silly", :inventor => "Mr. Pudey").save
SillyWalk.new(:name => "A Bit Silly", :inventor => "Mrs. Two-Lumps", :rating => 3).save
SillyWalk.new(:name => "Quite Silly", :inventor => "Mr. Teabag", :rating => 5).save
# To update the rating after creation of the initial record...
SillyWalk.find_by_name("Not Very Silly").rate(1)
# You could also do this
SillyWalk.find_by_name("Not Very Silly").rating = 1
# Retreive the rating
SillyWalk.find_by_name("Not Very Silly").rating # => 1
# Find silly walks with a rating of at least 3
SillyWalk.find_all_by_rating(3..-1) # => ["A Bit Silly", "Quite Silly"]
# Find silly walks with a rating of 5 (only)
SillyWalk.find_all_by_rating(5) # => ["Quite Silly"]
# Find silly walks with a rating of 1 or 5
SillyWalk.find_all_by_rating([1,5]) # => ["Not Very Silly", "Quite Silly"]
# Find silly walks with a rating between 3 and 5, inclusive
SillyWalk.find_all_by_rating(3..5) # => ["A Bit Silly", "Quite Silly"]
# You can also mix specific ratings and ranges...
SillyWalk.find_all_by_rating([1,3..5]) # => ["Not Very Silly", "A Bit Silly", "Quite Silly"]
Основные функции
* Встраиваится в любую модель
методы
* rate(int) — оценивает объект
* rating= — то же самое
* rating — возвращает рейтинг объекта
* find_all_by_rating — возвращает все объекты, выполняющие условие
* find_by_rating — возвращает первый объект, выполняющий условие
Вывод
Данные два представителя весьма ограничены и справляются лишь с задачей дать человеку возможность сказать хорошо/плохо. Это конечно уже что-то, но явно не достаточно. Поэтому вывод — писать что-то свое.