ユーザーフォロー1

やった事

  • ユーザーフォローの機能を作る

やった事詳細

DB設計

DBのプラクティスで提出したものを参考にした。

モデルを作る

scaffoldは関係する機能を全部作ってくれる。
こんなにいらないから、今回は使わない。
rails generate scaffold | Railsドキュメント

❯ rails g model Follow follower_id:integer followed_id:integer 
Running via Spring preloader in process 1289
      invoke  active_record
      create    db/migrate/20221012232051_create_follows.rb
      create    app/models/follow.rb
      invoke    test_unit
      create      test/models/follow_test.rb
      create      test/fixtures/follows.yml

下記記事がモデル同士の関係の作り方の参考になった!
【Rails初心者必見】has_manyでデータ管理を行おう! - WEBCAMP MEDIA

follower_idとfollowed_idの同じ組み合わせが出来ない様バリデーションを設定するには。。と調べたが分からず結局railsチュートリアルを見てしまった。
第14章 ユーザーをフォローする - Railsチュートリアル

db/migrate/20221012232051_create_follows.rb に下記を追加

add_index :follows, :follower_id
add_index :follows, :followed_id
add_index :follows, [:follower_id, :followed_id], unique: true

follower_idfollowed_idは頻繁に検索することになるのでindexをつける。
3行目は複合キーインデックスというもので、この組み合わせにユニーク制約をつけているので、並び順を保持する為のindex

indexとは

インデックスを付けた場合、並び順をDBが保持してくれるので、検索が早くなる。
DBのインデックスと複合インデックス - Qiita

下記のようなSQLを実行したとき、

select * from 社員テーブル where 社員コード = 1003

「社員テーブル(インデックス:無し)」のとき
データの並び順が決まっていないため、全件検索し該当レコードを探す

「社員テーブル(インデックス:社員コード)」のとき
社員コード列が昇順に並んでいるので、社員コード列に対して二分探索のようなアルゴリズムでの検索を行い該当レコードを探す
インデックスは検索を効率よく行う仕組みのため、テーブルの件数が多いほどインデックスの有無による速度差は大きくなる。
逆に、テーブル件数が少ない場合はそこまで差は出ない。

マイグレーションファイルに追加した状態でマイグレートした。

 rails db:migrate

モデルの関係付け

【Rails初心者必見】has_manyでデータ管理を行おう! - WEBCAMP MEDIAを参考にモデルへ関係性を追加。

  • userモデル
 has_many :follows, dependent: :destroy
 has_many :users, through: :follows

dependent: :destroyをつけると、ユーザーが削除されたときに、そのユーザーに紐付いた(そのユーザーが投稿した)followも一緒に削除されるようになります。

  • フォローモデル
belongs_to :user

コントローラー作成

コントローラー作成

❯ rails g controller Follows
Running via Spring preloader in process 3535
      create  app/controllers/follows_controller.rb
      invoke  erb
      create    app/views/follows
      invoke  test_unit
      create    test/controllers/follows_controller_test.rb
      invoke  helper
      create    app/helpers/follows_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/follows.scss

モデル同士を関連づけた後に、DBにどうデータを登録するのかが分からず、またrailsチュートリアル参照。