ネットで見かけた記事が article.id=1
を経由するやり方でなんかイケてなかったので。
[準備]redis-objectを利用する
redis-objectをプロジェクトのgemに追加します
source 'https://rubygems.org' do
# use redis server
gem 'redis-objects', '1.2.0'
end
モデルの設定
redis-objectをインクルードします。
sorted_set以外については公式のREADMEにまとまっているので参照のこと
redis-objects::Github
models/article.rb
class Article < ActiveRecord::Base
include Redis::Objects
sorted_set :ranking, global: true
end
global: true
のオプションをつけることでidに紐付かないkeyとして保存される
ついでに、PVをインクリメントするインスタンスメソッドも作っておく
models/article.rb
class Article < ActiveRecord::Base
# ~略~
def ranking_increment
ranking.increment(self.id)
end
end
コントローラからは @article.ranking_increment
を呼ぶたびにスコアが1ずつインクリメントされる
ランキングを取得する
ランキングを取得する際はインスタンスメソッドを経由する必要はなく以下で良い。
# スコアの上位1-5を取得
Article.ranking.revrange(0,4)
Article.ranking[0..4]
だとscoreの小さい順からになるので、 revrange
で取得する
以上です。
Redis-Objectは簡単で便利なのですが、メソッドの構成があんまり直感的じゃないので
Redisを理解してる場合はRedisで独自で実装した方がわかりよいような気がしました。
Enjoy Redis!