0
1

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 5 years have passed since last update.

Ruby on Rails チュートリアル 第14章 Relationshipモデル(フォロー・フォロワーの関係)

Last updated at Posted at 2019-11-07

Relationshipモデルについて

 ここでは、複数のユーザー間のフォロー・フォロワー関係を規定するrailsチュートリアルにおけるRelationshipモデルについて概要を述べる。
 あるユーザーAが別のユーザーBをfollowしているという関係を表現するためには、AがBをfollowする主体(AがBのfollower)であり、BがAにfollowされている(B is followed by A)という事態に着目して、以下のようなfollower_idとfollowed_idというデータ項目をもつRelationshipデータモデルを作成する。
image.png

このデータモデルを実装するために、

$ rails generate model Relationship follower_id:integer followed_id:intege

でマイグレーションを作成する。
このユーザー・フォロワー間のリレーションシップはfollower_idとfollowed_idで頻繁に検索することになるので、それらのカラムにindexを追加しておく。

db/migrate/[timestamp]_create_relationships.rb
class CreateRelationships < ActiveRecord::Migration[5.0]
  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
  end
end

 なお、このマイグレーションファイルには、follower_idとfollowed_idの複合キーインデックスを追加し、それらの組み合わせが一意であることを保証する記述があることに注意する。この一意性によりあるユーザーが同じユーザーを2回以上フォローすることを防ぐことができる。(2回目以降同じユーザーをフォローすると、既に登録されてある(follower_id,followed_id)の組み合わせが再び登場し、一意性が保てなくなりエラーが生じる。)
 
 次にUserとRelationshipの関連付けを行う。

app/models/user.rb
class User < ApplicationRecord
  has_many :microposts, dependent: :destroy
  has_many :active_relationships, class_name:  "Relationship",
                                  foreign_key: "follower_id",
                                  dependent:   :destroy
  .
  .
  .
end
app/models/relationship.rb
class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
end

 このuser.rbファイルでは、class_nameでUserと紐づけるクラス名(Relationship)を指定し、別々のデータモデルを繋げるkeyであるforeign_keyをRelationshipのfollower_idであると指定している。それらの記述を、has_manyメソッドに:active_relationshipsシンボルを渡したものに与えることで、一人のUserが、Realtionshipモデルのfollower_idで結び付けられる複数のactive_relationshipsデータを持てるようになる。また、relationship.rbファイルにより、一つのRelationshipはUserモデルのuser.idに対応したfollowerに一対一(belongs_to)の関係があることを指定している。この関連付けにより、以下のようなactive_relationshipが実現する。
image.png

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?