読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

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

エビコレ+ アマガミ(通常版)

エビコレ+ アマガミ(通常版)