Ruby on Rails 튜토리얼 제14장 Relationship 모델(팔로우 팔로워 관계)

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 데이터 모델을 작성한다.


이 데이터 모델을 구현하기 위해,
$ rails generate model Relationship follower_id:integer followed_id:intege

에서 마이그레이션을 만듭니다.
이 사용자 팔로워 간의 관계는 follower_id와 followed_id로 자주 검색되기 때문에 해당 열에 인덱스를 추가합니다.

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이 실현된다.

좋은 웹페이지 즐겨찾기