#前提
☆必要なテーブル
・usersテーブル
・relationshipsテーブル(中間テーブルです)
☆ポイント
・アソシエーションが普通の「多対多」とは違う事
#流れ
- relationshipモデルを作る
- relationshipのマイグレーションファイルを編集&実行
- userモデルとrelationshipsモデルにアソシエーションを書く
- userモデルにフォロー機能のメソッドを書く
- seedsにfollow
- relationshipsコントローラーを作成、編集する
- フォロー・フォロワー数、フォローボタンをviewに設置
- ルーティングを書く
- 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のマイグレーションファイルを編集&実行
下記のように編集してください
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モデルにアソシエーションを書いていく。
#自分がフォローした人を取り出す
has_many :active_relationships, foreign_key: "follower_id",
class_name: "Relationship",
dependent: :destroy
class_name: "Relationship"を使うことによりRelationshipクラスを直接指定することができる
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してね!」ということを示している。
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コントローラーにフォロー機能を書く