0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsでフォロー機能を作る方法

Posted at

#前提
☆必要なテーブル
・usersテーブル
・relationshipsテーブル(中間テーブルです)
☆ポイント
・アソシエーションが普通の「多対多」とは違う事

#流れ

  1. relationshipモデルを作る
  2. relationshipのマイグレーションファイルを編集&実行
  3. userモデルとrelationshipsモデルにアソシエーションを書く
  4. userモデルにフォロー機能のメソッドを書く
  5. seedsにfollow
  6. relationshipsコントローラーを作成、編集する
  7. フォロー・フォロワー数、フォローボタンをviewに設置
  8. ルーティングを書く
  9. usersコントローラーにフォロー機能を書く

#1. relationshipモデルを作る
userテーブル同士で「多対多」の関係を作るために中間テーブルであるrelationshipsをアソシエーションを使って実行する。なぜなら、フォロワーもまたuserだからです。
まずは、relationshipsモデルを作っていきます。

ターミナル
$ rails g model Relationship follower_id:integer followed_id:integer

relationshipsテーブルのカラムは

カラム タイプ
follower_id integer
followed_id integer
となる。

#2. relationshipのマイグレーションファイルを編集&実行
下記のように編集してください

db/migrate/_creation_relationships.rb
class CreateRelationships < ActiveRecord::Migration[5.2]
  def change
    create_table :relationships do |t|
      t.integer :follower_id
      t.integer :followed_id

      t.timestamps


    end
    add_index :relationships, :follower_id
    add_index :relationships, :followed_id
    add_index :relationships, [:follower_id, :followed_id], unique: true
  #add_index :テーブル名,カラム名
  end
end

add_indexを使うことによりデータの読み込み・取得が早くなる。
これが終わったらマイグレーションファイルをリセットし、seedでデータベースに初期データを投入する

ターミナル
$ rails db:migrate:reset db:seed

#3. userモデルとrelationshipsモデルにアソシエーションを書く
まずは、
relationshipsモデルにアソシエーションを書いていく。

models/user.rb
#自分がフォローした人を取り出す
has_many :active_relationships, foreign_key: "follower_id",
                                class_name: "Relationship",
                                dependent: :destroy

class_name: "Relationship"を使うことによりRelationshipクラスを直接指定することができる

models/relationship.rb
class Relationship < ApplicationRecord

 belongs_to :follower, class_name: "User"
 belongs_to :followed, class_name: "User"

 validates :follower_id, presence: true
 validates :followed__id, presence: true
end

**class_name: 'User'**と補足設定することで、follower/followedクラスという存在しないクラスを参照することを防ぎ、Userクラスであることを明示している。
要するに「follower/followedモデルなんて存在しないので、userモデルにbelongs_toしてね!」ということを示している。

models/user.rb
has_many :active_relationships, foreign_key: "follower_id",
                                class_name: "Relationship",
                                dependent: :destroy

#
has_many :followed_users, through: :active_relationships, source: :followed

#4. userモデルにフォロー機能のメソッドを書く
#5. seedsにfollow
#6. relationshipsコントローラーを作成、編集する
#7. フォロー・フォロワー数、フォローボタンをviewに設置
#8. ルーティングを書く
#9. usersコントローラーにフォロー機能を書く

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?