⭐️ブックマーク機能の追加

モデルのアソシエーション

Image from Gyazo

uniqunessヘルパーのscopeオプションにboard_idを指定することで、
掲示板(board_id)別にユーザー(user_id)との関係性を一意にすることができる

validates :user_id, uniqueness: { scope: :board_id }
この記載によって、
「1ユーザー」が「1つの掲示板」に対して「1ブックマーク」という範囲を限定した一意チェックができる

Image from Gyazo

・app/model/user.rb

has_many :bookmark_boards, through: :bookmarks, source: :board

ユーザーモデルは複数のブックマークされた掲示板(bookmark_boards)を持っている。
throughオプションでbookmarkテーブルを経由してuserモデルとアソシエーションを作成。
bookmark_boardsは仮のテーブル名なので、sourceオプションで参照するテーブルを指定している

has many :throughオプションで関連付けすると何がいいのか
ユーザーがお気に入りした掲示板を直接取得することができるようになる!
ユーザーがお気に入りした掲示板の一覧を取得するときに使う。

app/controller/boards_controller
Image from Gyazo

ルーティングの設定
Image from Gyazo

collectionオプションを使うことでboardsリソースの中にbookmarksアクションを追加できる、この時bookmarks_boards_urlbookmarks_boards_pathといったルーティングヘルパーも使えるようになる。

ほぉ、、、collectionオプションって便利🤔✨

コントローラー、もろもろの設定の流れ
・bookmarks_controllerを生成する
・bookmarkする処理はモデルに定義する
・自分が作った掲示板かを判定するメソッドをモデルに定義する(定義済)
・bookmarkしてるかを判定するメソッドをモデルに定義する
・bookmarks_controllerのcreateアクション、destroyアクションを定義する
・bookmarksアクションを定義する

ブックマークの処理

ブックマークの処理はモデルに記載するらしい!
理由はコントローラーに記載すると可読性が落ちるため 上記、補足※ブックマークのメソッドはrailsの7つのアクションと違う名前で定義するから
Image from Gyazo

🟢総括
今回はブックマーク(お気に入り機能)の実装でしたが、ブックマーク機能はモデルにメソッドの定義をしたり、今までのUser、Board、Commentモデルに加えての実装だったので、各モデルとのアソシエーションやルーティング関係が特に難しかったです。
これから課題をこなすにあたって、includeだったり、pathなどのヘルパーメソッドについても、これから深く勉強していかないとダメだなと感じました。