ユーザーフォロー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_id
とfollowed_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