Ruby on Rails 14章N:N関係モデル

Ruby on Rails 14章N:N関係モデルをやりました。

●n:nの関連モデル
フォローする、されるの関係は、n:nの関係となる。
→テーブルの物理モデルと同じく、リレーションテーブルの要領でモデルを作る。

follower_id, followed_idのペアを管理する。
1,2
1,3
1,4
だと、1のユーザは2,3,4をフォローしている。

rails generate model Relationship follower_id:integer followed_id:integer

Indexの定義も追加する。
class CreateRelationships < ActiveRecord::Migration[5.1]
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

●リレーションテーブルとの関連付け
ここではUserとRelationshipの関連付けをする。

・Userのmicropostsの関係
[User]
has_many :microposts, dependent: :destroy

[Micropost]
belongs_to :user

ここでは、has_many :micropostsとは、関連の名前ではなく、
モデル間の紐づきの指定に過ぎないが、
カラム的にも関連の取りようが1種類しかないので自明。

・UserとRelationshipの関係
Relationは2つのユーザの関連を持つモデルなので、
User→Relationへのモデル間の関連でいえば、2つの関係を持つ。

has_many :active_relationships,
class_name: “Relationship”,
foreign_key: “follower_id”,
dependent: :destroy

has_many :passive_relationships,
class_name: “Relationship”,
foreign_key: “followed_id”,
dependent: :destroy

#foreign_keyは省略って理解でよさそう。
class Relationship < ApplicationRecord
belongs_to :follower, class_name: “User”
belongs_to :followed, class_name: “User”
end

u.active_relationships.create!(followed_id: ‘2’)

u.active_relationships

SELECT “relationships”.* FROM “relationships” WHERE
“relationships”.”follower_id” = ? LIMIT ? [[“follower_id”, 1]

uはid=1なので、follower_idに自身のIDが入っている。

active_relationship.follower
→自分自身

active_relationship.followed
→フォロー先のid=2

自身に対して、だれがフォローしているか?は
passive_relationshipとして定義。

→SQLを見れば、「followed_id」=自分になっている。

コメントを残す

メールアドレスが公開されることはありません。