activerecord-reputation-systemでいいね!乞食になろう
たいがいのソーシャルなんちゃらにある、いいね!的な機能、ただ、投稿に対して1レコード分の評価的なものを足すだけだけど、実装しようとすると意外とめんどくさい。
めんどくさいし、たいがいのソーシャルなんちゃらにあるんだから、gemになってるんじゃね?と思ったらマジであった。
https://github.com/twitter/activerecord-reputation-system
RailsCastも有料じゃない記事である!いいね!
http://railscasts.com/episodes/364-active-record-reputation-system?autoplay=true
※ただし、ちょっとバージョンが古いので注意
これを使ってみよう。
実装イメージ
なんか適当な投稿物にいいね!する。
UserがPostにいいね!する、的な。
インストール
Gemfile
~snip~ gem 'activerecord-reputation-system' ~snip~
bundle install rails generate reputation_system bundle exec rake db:migrate
Post
has_reputation :likes, source: :user, aggregated_by: :sum
これを入れただけでとりあえずいいね!できるようになる。
具体的には
u = User.first p = Post.first p.add_evaluation(:likes, 1, u)
と、やるといいね!完了だ。
第一引数には任意のシンボルが入り、これが評価の種類になる。ここでは「いいね!」なので:likesにしてあるけど、実際はなんでもいい。同時に「よくないね!」ボタンも付けるなら、:dislikeとかつけておけば、いいね!と別個に付与・集計できる。
第二引数は、評価の数値。今回は、ただのいいね!なので、1をベタで入れてある。第三は、いいね!した人。
ちなみに、ここからさらにadd_evaluationするとレコード重複でエラーが飛ぶ。評価を上書きしたい場合は、add_or_update_evaluationというのがあったりするのでそれを使う。今回のようにいいね!とかFavなどのような、つけたり消したりのtoggleなボタンの場合で、間違いいいね!をあわてて消すにはdelete_evaluationすればいい。
User
Userサイドから見た時、自分がすでにいいね!したPostのいいね!ボタンはいいね!済みであることがわかるようにしたい。つまりUserといいね!をひもづけるにはこんな感じ。
User
has_many :evaluations, class_name: "ReputationSystem::Evaluation", as: :source ~snip~ def liked?(post) evaluations.where(target_type: post.class, reputation_name: :likes, target_id: post.id).present? end
上述のmigrationでrs_evaluationsってのが作られてて、ここで評価レコードが管理されているので、それと紐付けておく。で、それをもとにデータの有無を調べるメソッドを作っておけばおk。
ちなみに、Postについた全いいね!を知るには
p.reputation_for(:likes).to_i
で、取得できる。to_iしてるのは評価数はfloatで格納されているから。
こんな感じで、わずか数分でいいね!機能が実装できた!
いいね!
http://picup.omocoro.jp/?eid=1330
- 出版社/メーカー: 角川ゲームス
- 発売日: 2011/03/31
- メディア: Video Game
- 購入: 18人 クリック: 703回
- この商品を含むブログ (181件) を見る