紙一重の積み重ねスマートフォン用の表示で見る紙一重の積み重ねアラフォーのエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。Relationshipモデルの演習まとめ&解答例です。個人の解答例なので、誤りがあればご指摘ください。(および解決策)本章での学び【DB設計】各モデルの考え方ユーザー、ユーザーがフォローしているユーザー、能動的関係の3つを設計する。能動的関係:active_relationshipsテーブル自分からフォローする(能動的関係)相手からフォローされる(受動的関係)どちらも1つのテーブルで実現するため、テーブル名はrelationshipsテーブルとなる。上記を踏まえ、実装する。マイグレーションファイルを自動生成する。自動生成したマイグレーションファイルに、インデックスを追加する。2つのidの組み合わせが必ずユニークであることを保証する。endend【DB】マイグレーションの実行relationshipsテーブルを作成する。想像してみてください。4.3.2で紹介したmap(&:method_name)のパターンを思い出してください。user.following.map(&:id)の場合、idの配列を返します。id=1がフォローしているユーザーの配列が取得できる。想像してみてください。id=1がフォローしているユーザーの配列が取得できる。User/Relationshipの関連付け本章での学び【model】能動的関係に対して1対多(has_many)の関連付けを実装するuserモデルをリファクタリングする。userモデルとrelationshipsモデルは1対多の関係となる。:active_relationshipと名前をつけている。明示的にクラス名と、外部キーの名称を指定している。:destroyを付与している。:destroy【model】リレーションシップ/フォロワーに対してbelongs_toの関連付けを追加するrelationshipモデルと、フォローされているuserモデル(またはフォローしているuserモデル)は1対1となるため、belongs_toで関連付けを行う。14.1のcreateメソッドを使ってActiveRelationshipを作ってみましょう。データベース上に2人以上のユーザーを用意し、最初のユーザーが2人目のユーザーをフォローしている状態を作ってみてください。最初のユーザーが2人目のユーザーをフォローする。10:52:28">演習2先ほどの演習を終えたら、active_relationship.followedの値とactive_relationship.followerの値を確認し、それぞれの値が正しいことを確認してみましょう。active_relationship.followedは、自分がフォローしているユーザを返す。id:2が返ってくる。active_relationship.followerは、フォロワーを返す。id:1が返ってくる。followed_id@relationshipのfollowed_idにnilを代入@relationshipが有効ではないこと上記を踏まえて実装する。14.5のバリデーションをコメントアウトしても、テストが成功したままになっていることを確認してみましょう。5から必須ではなくなりました。今回はフォロー機能の実装を優先しますが、この手のバリデーションが省略されている可能性があることを頭の片隅で覚えておくと良いでしょう。)該当箇所をコメントアウトする。trueコメントアウトしてもテスト結果がgreenになることを確認。throughを使う。Railsは、デフォルトでは、has_manyに指定された単数形のモデル名に対応する外部キーを探す。そのため、:sourceパラメータを使って、「following配列の元はfollowed_idの集合である」ことを明示的にする。上記を踏まえて実装する。end【model】following関連のメソッドの実装テストコードで作成したメソッドの中身を実装する。endテスト実行テスト結果がgreenになることを確認。14.9のコードを順々に実行してみましょう。実行結果は以下の通り。false演習2先ほどの演習の各コマンド実行時の結果を見返してみて、実際にはどんなSQLが出力されたのか確認してみましょう。本章での学びフォロワー機能を実装する。【model】受動的関係のデータモデルの考え方relationshipsテーブルを使う。Michael(id=1)は、3人のユーザのにフォローされている。followed_id=1と、follower_id=3,2,9上記を踏まえて実装する。:followerを省略することも可能。単数形のfollowerに変換して、follower_idを探してくれる。上記を踏まえて実装する。end動作確認テストがgreenになることを確認。skips演習1コンソールを開き、何人かのユーザーが最初のユーザーをフォローしている状況を作ってみてください。最初のユーザーをuserとすると、user.followers.map(&:id)の値はどのようになっているでしょうか?最初のユーザから、4番目までのユーザを作成する。nil>3人のユーザが最初のユーザーをフォローする。04:05:53">最初のユーザーのフォロー数を確認する。3人のユーザからフォローされていることを確認。4]演習2*上の演習が終わったら、user.followers.countの実行結果が、先ほどフォローさせたユーザー数と一致していることを確認してみましょう。user.followers.to_a.countでも、同じく3が返ってくる。100万人のフォロワーがいた場合、100万人分の配列を生成してその数を返す。配列を生成する分、実行コストがかかると思われる。user.followers.countは、Railsは高速化のためにDB内で合計を計算する。これまでのモデルに比べると、多対多の関係となっているため複雑です。モデル間の構造を意識しながら、これからもプログラムを書いていきます。はてなブログProSIerで働く36歳のエンジニアです。自社WEBサービスの開発・AWSのインフラ構築を行っています。なれる最高のフルスタックエンジニアを目指して、RailsやAWSをこつこつ学習中。本を10冊出すことが夢です。PL/SQL」(シーアンドアール研究所)の著者。#devsumiDスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。