Edited at

ざっくりとgem 'acts as follower'の導入手順

More than 1 year has passed since last update.


はじめに

本記事は著者のプログラミング知識を整理し、「半年後の自分が見返しても理解できる記事」を目的に書かれています。また、著者と同じくプログラミング初学者の方を少しでも手助けれきると幸いです。

また、著者はプログラミングを学び始めてからまだ日が浅く、間違った情報、間違った認識を掲載している可能性があります。そういった箇所を発見された方は編集リスクエスト等でご連絡くださいませ。

ではいきます。


環境

ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

Rails 5.1.4

※使用するgemは「acts as follower」

https://github.com/tcocca/acts_as_follower

※フォロー機能をもたせる下記Userモデルはgem 'devise'を用いて作成しました。


app/models/user.rb

class User < ApplicationRecord

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end


acts as followerを選んだ理由

・Qiitaにて既にgemを導入されている方が多数いらっしゃり情報量が豊富

・gemの導入後はall_followingやfollwersといったメソッドにより容易にフォロー関連のレコードを取得できる


導入手順

※アプリケーションの土台とUserモデルの作成は割愛させて頂きます。


gemを導入する

今回、私はRails5を使用しているためGemfileに下記を追記します。

source "https://rubygems.org"

git_source(:github) do |repo_name|
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
"https://github.com/#{repo_name}.git"
end
...
gem "acts_as_follower", github: "tcocca/acts_as_follower", branch: "master"
...

Rails4以前だとGemfilへの記述が異なります。公式のGitHubを参照しましょう。

Gemfileへの記述が終わったらbundleを実行しましょう。

$ bundle update

$ bundle install

無事に完了したらジェネレータを走らせてFollowモデルを作成します。

$ rails generate acts_as_follower

下記のようなFollowモデルとマイグレーションファイルが自動生成されればOKです。


app/models/follow.rb

class Follow < ActiveRecord::Base

extend ActsAsFollower::FollowerLib
extend ActsAsFollower::FollowScopes

belongs_to :followable, polymorphic: true
belongs_to :follower, polymorphic: true

def block!
self.update_attribute(:blocked, true)
end
end



db/migrate/(timestamps)_acts_as_follower_migration.rb

class ActsAsFollowerMigration < ActiveRecord::Migration[4.2]

def self.up
create_table :follows, force: true do |t|
t.references :followable, polymorphic: true, null: false
t.references :follower, polymorphic: true, null: false
t.boolean :blocked, default: false, null: false
t.timestamps
end

add_index :follows, ["follower_id", "follower_type"], name: "fk_follows"
add_index :follows, ["followable_id", "followable_type"], name: "fk_followables"
end

def self.down
drop_table :follows
end
end


マイグレーションの実行も忘れずに行いましょう。

$ rake db:migrate


Userモデルに「フォローする機能」を持たせる


app/models/user.rb

class User < ApplicationRecord

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

acts_as_follower
end


こちらを追記することで他のUserモデルは他のモデルをフォローすることができるようになります。公式ではUserモデルがBookモデルをフォローするような実装になっていますが・・・同じモデル同士でフォローし合う場合でも実装方法は変わりません。


Userモデルに「フォローされる機能」を持たせる


app/models/user.rb

class User < ApplicationRecord

devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable

acts_as_follower
acts_as_followable
end


これでOKです。Userモデルにはフォローしたりされたりする機能が追加されました。