第14章の復習メモです。 個人的に重要と思ったことを書きます。
前回と同様、以下3つの視点で書きます。
- 分かったこと
- 分からなかったこと
- 今回はスルーしたこと
分かったこと
モデル間の関連付け
has_many、belongs_to(13章の続き)
13章で、モデル間の関連付け方法を学習した。1対多の場合はhas_manyを、1対1の場合はbelongs_toを使う。
has_many
class User < ApplicationRecord
has_many :microposts
.
.
.
end
belongs_to
class Micropost < ApplicationRecord
belongs_to :user
.
.
.
end
上のコードでは、has_many、belongs_toのパラメータに、相手のテーブル名を指定するだけで、関係付けが出来ている。しかし本来、モデルの関係付けを行うには、相手のクラス名や結合キーを指定しなければならない。
上のコードで、それらを指定する必要がない理由は、テーブルの外部キーが予め設定されているから。micropostsテーブルは、外部キーuser_idカラムにより、usersテーブルと紐づいている(外部キーの設定は13章で学習済み)。
本来必要な情報を付け加えると、以下のような書き方になる。
has_many
class User < ApplicationRecord
has_many :microposts, dependent: :destroy
has_many :active_relationships, class_name: "Relationship",
foreign_key: "follower_id",
dependent: :destroy
.
.
.
end
belongs_to
class Relationship < ApplicationRecord
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
end
has_many :through
上の図は、本章で実装した「他ユーザをフォローする仕組み」について、モデルの関係性を表している。active_relationships(実体はrelationshipsテーブル)が、フォローする側とされる側の(ユーザIDの)対応表になっている。
「あるユーザがフォローしているユーザ」の情報が欲しい場合、
userテーブル<idカラム>【あるユーザ】
↓
(through)
↓
active_relationships<follower_idカラム>
↓
(同テーブル内)
↓
active_relationships<followed_idカラム>
↓
(has_many)
↓
userテーブル<idカラム>【フォローしているユーザ】
こんな感じ(?)で取得できる。
これをコードで書くと、以下の形になる。
has_many :followeds, through: :active_relationships
要するに、「active_relationshipsを通して、followedカラムを外部キーに、対象ユーザを取得する」というニュアンス?(私はそう解釈しました)
因みに、has_many :followeds
のfollowedsは、英文法的によろしくないので、followingという表記にしたい。これを踏まえたのが以下の書き方。
has_many :following, through: :active_relationships, source: :followed
source: :followed
の部分で、外部キーを明示している。
また、この関連付けを行ったことで、Userモデルに対してfollowing_ids
メソッドが使えるようになった(自動生成された)。
これは、先の「あるユーザがフォローしているユーザ」の一覧が、配列で取得できる。実行結果は以下の通り。
>> User.first.following_ids
=> [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51]
ちなみに、このメソッドは、>> User.first.following.map(&:id)
と同じ結果となる。
分からなかったこと、今回はスルーしたこと
- Ajax
- テスト全般
- アプリケーションの仕様、ロジックの詳細
所感等
ひとまず1周終えることができました。
未熟ながら、プログラミング経験者ではありますが、レガシーな開発しかしたことがなかったので、初めて触れる知識ばかりで新鮮でした。
この後も、何かしら学習は続けていきたいと思います。差し当たって、2周目をやるか、自分なりに何か作ってみたいと考えています。