LoginSignup
0
0

More than 3 years have passed since last update.

Railsチュートリアル 第14章<復習>

Posted at

第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

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

belongs_to

app/models/relationship.rb
class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
end

has_many :through

image.png

上の図は、本章で実装した「他ユーザをフォローする仕組み」について、モデルの関係性を表している。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周目をやるか、自分なりに何か作ってみたいと考えています。

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